From da0175faf7b64e824789aeaec5aa057727214a5e Mon Sep 17 00:00:00 2001 From: rafal-gorecki Date: Thu, 19 Sep 2024 16:41:18 +0200 Subject: [PATCH 01/12] Fast light configuration --- .../launch/controller.launch.py | 4 +- .../animations/lynx/triangle01_green.png | Bin 0 -> 7011 bytes .../animations/lynx/triangle01_red.png | Bin 0 -> 6828 bytes .../animations/lynx/triangle01_red_v2.png | Bin 0 -> 8069 bytes .../{ => panther}/battery_critical.png | Bin .../animations/{ => panther}/battery_low.png | Bin .../{ => panther}/strip01_purple.png | Bin .../animations/{ => panther}/strip01_red.png | Bin .../{ => panther}/triangle01_blue.png | Bin .../{ => panther}/triangle01_cyan.png | Bin .../{ => panther}/triangle01_green.png | Bin .../{ => panther}/triangle01_orange.png | Bin .../{ => panther}/triangle01_purple.png | Bin .../{ => panther}/triangle01_red.png | Bin .../{ => panther}/triangle01_yellow.png | Bin panther_lights/config/lynx_led_config.yaml | 123 ++++++++++++++++++ ...ed_config.yaml => panther_led_config.yaml} | 16 +-- panther_lights/launch/lights.launch.py | 17 ++- 18 files changed, 149 insertions(+), 11 deletions(-) create mode 100644 panther_lights/animations/lynx/triangle01_green.png create mode 100644 panther_lights/animations/lynx/triangle01_red.png create mode 100644 panther_lights/animations/lynx/triangle01_red_v2.png rename panther_lights/animations/{ => panther}/battery_critical.png (100%) rename panther_lights/animations/{ => panther}/battery_low.png (100%) rename panther_lights/animations/{ => panther}/strip01_purple.png (100%) rename panther_lights/animations/{ => panther}/strip01_red.png (100%) rename panther_lights/animations/{ => panther}/triangle01_blue.png (100%) rename panther_lights/animations/{ => panther}/triangle01_cyan.png (100%) rename panther_lights/animations/{ => panther}/triangle01_green.png (100%) rename panther_lights/animations/{ => panther}/triangle01_orange.png (100%) rename panther_lights/animations/{ => panther}/triangle01_purple.png (100%) rename panther_lights/animations/{ => panther}/triangle01_red.png (100%) rename panther_lights/animations/{ => panther}/triangle01_yellow.png (100%) create mode 100644 panther_lights/config/lynx_led_config.yaml rename panther_lights/config/{led_config.yaml => panther_led_config.yaml} (76%) diff --git a/panther_controller/launch/controller.launch.py b/panther_controller/launch/controller.launch.py index 0343163e2..61e8f9464 100644 --- a/panther_controller/launch/controller.launch.py +++ b/panther_controller/launch/controller.launch.py @@ -285,8 +285,8 @@ def generate_launch_description(): actions = [ declare_battery_config_path_arg, - declare_robot_model_arg, # robot_model must be before wheel_type - declare_wheel_type_arg, # wheel_type must be before controller_config_path + declare_robot_model_arg, # robot_model is used by wheel_type + declare_wheel_type_arg, # wheel_type is used by controller_config_path declare_components_config_path_arg, declare_controller_config_path_arg, declare_namespace_arg, diff --git a/panther_lights/animations/lynx/triangle01_green.png b/panther_lights/animations/lynx/triangle01_green.png new file mode 100644 index 0000000000000000000000000000000000000000..2e82b62a334f2efb6552018021861c255c2bf25c GIT binary patch literal 7011 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⪚0ayi@6G%bcBrF+v^oW2a8wUbV0TvO$ruxvBI5r--g^L64H^m4jWJ`tRjfdKq zSwM7s82|(gN5hq2`fN%73VK8UqRAk;<1F zW`DxdnBQ3d`9QFVbOaKvjG$5xKUy$Z`T-!wcZdF~1(N{oP!N^?)7PIt0`vm_8cX3v z2r}tUd%8cvXDb{s2?6*3R8W-(&Wilol!nG;7Jpi7Qs6*57>F z9N7xzM@K;OKXL!2{YUIu%Al5+8BWia>|40@x2#KO?(7&RD? zq)LQguqdpW8f6Oecj(^Z*can#b0_CgC`33u8PK1y}w{V&Ow% zxq}9Hs40c!&;DzGK%oLwEaE1cNHvtI8U}?%s$!LuRa8{}QnCRUOt2C+F_Fq}m2bG4 zX~BWPfW#6v>l6govH)Yj=`sK!%a=j$_4UC+H(i2kT5gp$MDtrxj3`V{RETD?<_A14eAV)qg~+iTFR9Xl^O|und59 z-(=wO0tIQ|A^mz>H3$hf5gB)QvSEP{-x_5G4PL+ z|E;e7H@XD=+VB80unP(Vw=*R#cp|{9&^EVYhI$+uo1dH2xyhhpJKe~h3I0`~uz7N_ zvyTRVLOzzUnLgj-b}>OI^{FVfJt*44(zj#j`cgOhW{$0P4j@AUDJ)OOW;;_@7LPZw6O6D!8*wxi=QhCni6rfB7b_k^nC$g`XYYNA`nTMND*mX zc6yQME(=+mntc9Q(^8r{MNyO2I%*}w||O_dG^e_QdDA$ zfp<)vK?cN1<_p_fsm(r3cajht{nQ=!cFgaqYEOx*ch9|=V~(huwoKTLuS3&&tJ}(? z*)OO26Zu_jr#6a?D9lbj%w*i*DKgmy0RNhR`}wbrh-Sd zAFMvAc_Moy^1z*s!Si9MLo(MZI;-k<2|+8-2MRwf)8$i#gy4Cd{dK(7tIKp^YK@H3 z$!xWTaGM|%C(rLUXW*rsS4S^0ss&uRT>U31gSUO5pLm`8sAyOt!ZoGnkl(rV;rYGS zm0asCx@amtws2!Ll6JeiT{(x+Y*5+yI%>+KIgEys)o*x)Z@dx+=@Qt;7o%1D_Q-ad jCgmFY>w&O}cXHT?qw<3#+i!rS$6>5*u2-mY^89}Q5=oH# literal 0 HcmV?d00001 diff --git a/panther_lights/animations/lynx/triangle01_red.png b/panther_lights/animations/lynx/triangle01_red.png new file mode 100644 index 0000000000000000000000000000000000000000..f373e2070a59014e5b3f29e2fe701130ac785aa0 GIT binary patch literal 6828 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 smHa3umZn z$$C3)J=|QZcKXAhJpjOm39`0lSmFb~K6IKJ#fuDP1p1J{WG2N80ARjoze1t!SKA%^ zV_Mjk!z<>ss=d_2uG!TUPz%oL#HT~Y5rus+k3I6tkGrKm{Psa}bR*V|@i;@SxiBN; zHORA~<73gYg^~V}+K(YQmlM`=g4MipRMd4MJe$I7&m_Tm*A^EiKTq^%%xdlp3ORj& zwmhxx`IUJ_ZQ=uG=vrX@XyjC7_WL%;CJ~8Yae}03#Y{T&EQ=hWARfRMWgLegYcjsfDWxCg>S+%cv z?z7(Ym}93riJ$}8Q?V~*<9_u;9g|31AzVt4VOqNO;Dh7xvN3PcbrK!u4=^IBp5D@z z>SD6K1bO&z zaW39+3e~6nTScu>qhS%~az)*;LV0BauKs}kSk2HQx63X8!TRs{7hoUEbo<6FR%9)) z2+eD~9*>fwvu?$CJUn+LDKXr=K)=V(>%vtfsD4%Q(3Nfj>lkK&@UBM;F$84a<&~Oo zlz+es--(U%rmN1TV;go-?r4T&!dTVmb(i7dnjTf5)(7USFeM=_5xwW1XjQX&1iDV|+iRF*GknuN_;9F7X&E&>&0|nk^#W+fL63E&mI?E6e+b+*_m{Vmi zV^A%QGJ2Ar0>9d#hkOotGmsj)Ff+tEAy=V!*uiQ9bhI>zkfVGjQTEp2kOAfBJ~RIm zhg$awhO%PbwKq$|93yXsNXDNMMc!RRzN#b3Jjjbh+M^?qfRY9?Ji%n z;>8hPdrcDihZo)%8a!(7T&#c3fj6p5o79j#;02US<~vzw{#DxC8TGpQw~|orqi_q# z!Ja)~S{OnB^L+KEZp|wdRqB^#ElQ3V>Lsclnr=3Zm@a&V4!)J%@Csm@K1Isxd23PJ zbkRuU){)lu=agae^QABa&WiJ>oVv7|-|m6H*P8+h#N4B=pF0Bguek|OxD$oVAF(iY zYL0(@Pb4e;tIH$mY2u|Pr_Ku0a@=ygx2n5Sa7xfVl)<|ue~(MBGKS(frr1?Vd32#5 ztuUz`WA_zDjZeMs%IIB3;FzDDkwJ6K5W*|6{Yv1;p0ak=R@++V=Yjy>j%M6@IgX;d zNXx+lnZ3`RC~QcS@`7ADOa^<3#8o8XOvs-a&U!g>KelW$fD&$KOUH3~fa9F($Oh~q zMfC@;_prDV8$^}c(CndI%R^%a0Vi%+p2rk^ha(_SRmx{$33FbRjrn4zDaP5 z?n;qp41M|3nUZN78|RL*zJQdtgovKc7fcAZIM6&$Hc}-t*)ZPQ5T05A;`e=)_Q3Rf z%J66KeIziy7-i4N_6eQo&+27H>>C%$uW`pvQf8tI}R-8=kk&zxHGiMX^m!zs|E@j^iUkc+{!){RCK zXXy<3X5B_YQoD;?ZG`U8gL*moZglXyi-Q8sce@Bry2;B$&JuaJM6|9S)T~su zYSunzZP1ilK7d`^QRbtKo-*QYDA0Zj;H*;vX;lWS$Lef+Keaj-#Ls_z2^beB*OKxD zDd>W(*3CD>%|X!)Ag%6ZVO4g;(#b71;!Ku1x#DU6>B?@SD=-C%<-(7&US=B>?@U%-RpyEc8LxxFr)B87xid_H zEn1G1j~YJZ#4)AQqpVy`^Tf2(NT~w-Bjj&g=>_r$8<*eRY?cN|&at^Q1zPc_|G52; zG4wq93IQ6&USN#AgyUWMbn>lOQSnZfWHH;(T)*ppRiP%Wx7wS=)&&ic-~_r`?veBJ zQV7A*;r1%GE?F)m&qQ7*tBlP!%${AyF9~>|AAZWy?>Ed>E~ma&tuL>6Tp!;c54z=F zxDB2lOu3<{oLbg$m3Q`4M2n{!oKpf9SHA3)c!5m0X1&}ng-p4On7}-cE zdLM~*%~*bM>{2N*PZ1)vGq=u7!=Y~xNi_`XwT8Ab|KpK*zn+p%r$b)Bcba3Zu%OU_e8VKb=G9A z@maM6C~L+Oj4t!@_$@$@`sHPbj^^j(it^%Kx}CBwevq8);c3e|o<|T16%0>zF@5o= zw84n|T)$xjbcqYIbE(T_&wvfkB`x}GLglzvJ5hykiaVgh>R8C*35jvDOLd)PB^tyL z?YkrA_J5DbQ-6JSxR_5JaYnA;lY`*e=17~0){pS~%D4u?n>zbTRl#ODIsW_BHMll& z_ogJUUC0vv+3o~#&YW}=W-g=mSML4B%}jy-^(Qi2_L{Kq2po8o)=BDYUjLRy0dr=5 zAinH8@pPkZ$+gOJLS=P&A;S#wD%-EmPJE-Ka_xMS>r-Xd(@P62vx@v-E>B7OqBe#* z6R7sR)Jy6?o_5Dk{AQIB{oJ7*Ino73DGwgcZJ5T1W(SOM``6Dl^YwKF%FW$l_$cO~ z4%YHz(yc_i1B2hEODe7|9vOP6T%z-$cF@`PmEoDF7N+uhGN<7}Mwn=3tCF6U72mF< zE3b88d4uXEbK;3tX&8~AzQ(MdJ>DyFE4kM6gPStk7f)!`sKi@3>kODS%@AFTT2%k980Py}fQDryXOi zST}!?{#FD{F|>3R=X@F&B^htCL&V+XfHSAo5_`|{Zro!%qYYO}521zb)0z|G!DH?0 z(fTnI+kTF`w+&ZKWqQ24ZTQ*>BoA^3X*s*4BV=*%j03J;mp*=m_SUxKuKV(p1;zu9 zCNtATi%r_J)N3jGv%bdNt~gZQ^QLE7#^vH_^1}JMw5)h2uR6-hZE&RrPpE#@ZM35{ zrBujlkAaOzNyx#4>IZ@GwYH_zPc+teqXI+8R~OI*7keP-V6Es#u?N??^b>5eg?TA2 z%oraHoI7=)G0tQ-{cs-7u9}4%KcXhb9b-yyF!?KhAXo7>L}BiCY<(@$A(CpQD;!Ij z>~=w;u2jHBv%v+bQV<6pm0jd1)#N!lG$8z?tj-a#-SUty59icoLWlg0Xzz#!<*LRf zM@=Qe`TWvafc*Rs)ev%3KwyBYJMBjf#W09YwhA(} zCI)#DF(ioQQ66F;EinuN-d16FYC!Bw%)vS|IvI?H zqM>jlJtoB;2|3CGR;QEPu$H>|zaUs&8W0Z#!v_n41q1{@15i*J-5rL&U@$N^5{5)7 zu{4x?1HBn|rjoa>)E2}~3|+D>kxubpP-x!ZElfOt=Eu;0Kv?78-~FTdn3((l@9q1G z1r{GLCf)~zfWl!^D(tToz6?Eo7RWD${-cGjHLEs;S(1Heesm&P&!6ngkoqeGiTH=T zk00G@I~)=bM)o38S*pIQSrLDm(g0^-{)fdD1@088&$bnd?7wL;C~kj}^*7(PMz+KG zt0OG)KXCu1{d?@&$}BAt6Ra+c=(pt_PFDl6H9wX_BT`7%?JgQl!Xr>TTmnx6dvP7BB5A$fyR@GN@$E5Mu`B2 zBbAUC41qvIVGt-hY8#3~#Ol-NR6J`rDO9{W8Rp~dzCEx-I9AIXrvX7i;eSfZz3>b- zmVpMunBwin{ByvXLM2-<@LOymRFFqh&={mL<_JO+gI4}i$(Bs_Wo6d?t}290h_qj_mSwp;>lS#GB{SpDas7*c#$8i89G|10OM z$ftjP{oDdxl{0`Lp05d$Vpq0jzQ+671N*DuuWR#|?A=KeqmP?Io!!$xa_b2VVdHDz)_h znMIoZEa46Y&O~p=+|E6GkUdruyAhU1l%Z$O(4kSc?#+Ph>l~Q`4xlhRz+2Zjy9j;} z0DyfNr>kYneDOZp#cb&0zOz-{(r%e@`z(qhUkUCC>*=vN(;WLS4SCNTc5&38bD)e-)fO@R>UIk zX+#KzIKY*BO}kNGUB-vEiFbw;F3@E_l#THg`6BoXD8atwGZU7u zRd@*RD*ML8PT8(}HrJq_E-KM4DO?FWDZH|_BTH08;~ccHQM)Q_^v--3L@`({!7jW_QB7bb z^*Ps3UQ*vmP;;mxQ|_=z^n0EG&Sm3`?_xKhxewy%(yaPc9GlyBvjk=JZRRXR!P4jk;PLL7sM9iv?XKb3714GomX0%fD>+?U9HD& zu+hrD!3q|igg07jE?jT5nW9?$Xqopuz;qh!tZY$ZpCEm9)gR9W&}zQH$`>Dnt5|GO zuebV6nOL6LKffrygRgmSFarf^V(n0aaaA zmS^nd7Y{HM=06yXM*))@HeJes1*dF=HLYzbEP<%lADRJcvxM^V9f~Ifr>brAazO)X zOIOMW=XmyUF!^i{)|`A?>I@q`8(fCWg$wkxlz+*)rmaPiwalTTY+r@+POcP7ZL z&@AcY(_dtEPLXXM`{%4BmrLZk(ZxYSF&P9yc{ur2-Q1;23myB;Q z5EwiA?QY>B4&Z9LNwoZ082;4a$FpG#(J8-SO?^Kzo>j=aS>b%np(TawxA>C7{27_R z6K!(`FKb$fq_)WJ49WQ>GOEv}CgW$u;yNdnzQ$WXeBL3esQzWllxLNcqnW}kPuGkY zGv!*X3!6x#3P2V|ttR{RAR^o?1-tI2%MLF7=vKX1o<$ZALEfZs>}xa(>5cHKtq52~lRY tmusiM*VbDCX%Um4#7ZCKKAHYA*D{kQ(@oA5vW^G Date: Mon, 23 Sep 2024 13:54:18 +0200 Subject: [PATCH 02/12] Add lynx lights launch, fixed tests, unify arguments and config names --- .gitignore | 6 +-- README.md | 6 +-- panther_gazebo/CONFIGURATION.md | 2 +- panther_gazebo/README.md | 2 +- ...plugin_config.yaml => battery_plugin.yaml} | 0 .../launch/simulate_robot.launch.py | 2 +- panther_lights/CMakeLists.txt | 3 +- panther_lights/CONFIGURATION.md | 17 ++++--- panther_lights/README.md | 7 +-- ...x_led_config.yaml => lynx_animations.yaml} | 1 - panther_lights/config/lynx_driver.yaml | 5 ++ ...ed_config.yaml => panther_animations.yaml} | 0 panther_lights/config/panther_driver.yaml | 5 ++ .../panther_lights/lights_controller_node.hpp | 4 +- .../panther_lights/lights_driver_node.hpp | 3 +- panther_lights/launch/lights.launch.py | 34 +++++++------ panther_lights/src/lights_controller_node.cpp | 18 +++---- panther_lights/src/lights_driver_node.cpp | 14 ++++-- panther_lights/test/files/animation.png | Bin 0 -> 900 bytes .../test/integration/panther_lights.test.py | 7 +-- .../unit/animation/test_image_animation.cpp | 10 ++-- .../led_components/test_led_animation.cpp | 2 +- .../test_led_animations_queue.cpp | 2 +- .../unit/led_components/test_led_segment.cpp | 8 ++-- .../led_components/test_segment_converter.cpp | 4 +- .../test/unit/test_lights_controller_node.cpp | 27 ++++++----- .../test/unit/test_lights_driver_node.cpp | 45 ++++++++++-------- panther_manager/CONFIGURATION.md | 2 +- panther_manager/README.md | 2 +- ..._hosts_config.yaml => shutdown_hosts.yaml} | 0 panther_manager/launch/manager.launch.py | 2 +- 31 files changed, 133 insertions(+), 107 deletions(-) rename panther_gazebo/config/{battery_plugin_config.yaml => battery_plugin.yaml} (100%) rename panther_lights/config/{lynx_led_config.yaml => lynx_animations.yaml} (99%) create mode 100644 panther_lights/config/lynx_driver.yaml rename panther_lights/config/{panther_led_config.yaml => panther_animations.yaml} (100%) create mode 100644 panther_lights/config/panther_driver.yaml create mode 100644 panther_lights/test/files/animation.png rename panther_manager/config/{shutdown_hosts_config.yaml => shutdown_hosts.yaml} (100%) diff --git a/.gitignore b/.gitignore index f42d579a3..ac9f2a85e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ -devel/ -logs/ build/ +log/ +install/ bin/ lib/ msg_gen/ @@ -13,8 +13,6 @@ msg/*Feedback.msg msg/*Goal.msg msg/*Result.msg msg/_*.py -build_isolated/ -devel_isolated/ # Generated by dynamic reconfigure *.cfgc diff --git a/README.md b/README.md index da2a5affc..f141f4b5b 100644 --- a/README.md +++ b/README.md @@ -84,6 +84,7 @@ Launch arguments are largely common to both simulation and physical robot. Howev | --- | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 🖥️ | `add_wheel_joints` | Flag enabling joint_state_publisher to publish information about the wheel position. Should be false when there is a controller that sends this information.
***bool:*** `False` | | 🖥️ | `add_world_transform` | Adds a world frame that connects the tf trees of individual robots (useful when running multiple robots).
***bool:*** `False` | +| 🤖🖥️ | `animations_config_path` | Path to a YAML file with a description of led configuration. This file includes definition of robot panels, virtual segments and default animations.
***string:*** [`{robot_model}_animations.yaml`](./panther_lights/config) | | 🖥️ | `battery_config_path` | Path to the Ignition LinearBatteryPlugin configuration file. This configuration is intended for use in simulations only.
***string:*** `None` | | 🤖🖥️ | `components_config_path` | Additional components configuration file. Components described in this file are dynamically included in Panther's urdf. Panther options are described in [the manual](https://husarion.com/manuals/panther/panther-options).
***string:*** [`components.yaml`](./panther_description/config/components.yaml) | | 🤖🖥️ | `controller_config_path` | Path to controller configuration file. A path to custom configuration can be specified here.
***string:*** [`{wheel_type}_controller.yaml`](./panther_controller/config/) | @@ -95,7 +96,6 @@ Launch arguments are largely common to both simulation and physical robot. Howev | 🖥️ | `gz_log_level` | Adjust the level of console output.
***int:*** `1` (choices: `0`, `1`, `2`, `3`, `4`) | | 🖥️ | `gz_world` | Absolute path to SDF world file.
***string:*** [`husarion_world.sdf`](https://github.com/husarion/husarion_gz_worlds/blob/main/worlds/husarion_world.sdf) | | 🤖 | `launch_nmea_gps` | Whether to launch the NMEA NavSat driver node. Advisable when the robot is equipped with the [ANT02](https://husarion.com/manuals/panther/panther-options/#ant02---wi-fi--lte--gps).
***bool:*** `False` | -| 🤖🖥️ | `led_config_file` | Path to a YAML file with a description of led configuration. This file includes definition of robot panels, virtual segments and default animations.
***string:*** [`led_config.yaml`](./panther_lights/config/led_config.yaml) | | 🤖🖥️ | `lights_bt_project_path` | Path to BehaviorTree project file, responsible for lights management.
***string:*** [`PantherLightsBT.btproj`](./panther_manager/behavior_trees/PantherLightsBT.btproj) | | 🤖🖥️ | `localization_config_path` | Specify the path to the localization configuration file.
***string:*** [`relative_localization.yaml`](./panther_localization/config/relative_localization.yaml) | | 🤖🖥️ | `localization_mode` | Specifies the localization mode:
- 'relative' `odometry/filtered` data is relative to the initial position and orientation.
- 'enu' `odometry/filtered` data is relative to initial position and ENU (East North Up) orientation.
***string:*** `relative` (choices: `relative`, `enu`) | @@ -103,10 +103,10 @@ Launch arguments are largely common to both simulation and physical robot. Howev | 🤖🖥️ | `publish_robot_state` | Whether to publish the default Panther robot description.
***bool:*** `True` | | 🖥️ | `robot_model` | Specify robot model type.
***string:*** `env(ROBOT_MODEL)` if not specified `panther` (choices: `lynx`, `panther`) | | 🤖🖥️ | `safety_bt_project_path` | Path to BehaviorTree project file, responsible for safety and shutdown management.
***string:*** [`PantherSafetyBT.btproj`](./panther_manager/behavior_trees/PantherSafetyBT.btproj) | -| 🤖🖥️ | `shutdown_hosts_config_path` | Path to file with list of hosts to request shutdown.
***string:*** [`shutdown_hosts_config.yaml`](./panther_manager/config/shutdown_hosts_config.yaml) | +| 🤖🖥️ | `shutdown_hosts_config_path` | Path to file with list of hosts to request shutdown.
***string:*** [`shutdown_hosts.yaml`](./panther_manager/config/shutdown_hosts.yaml) | | 🤖🖥️ | `use_ekf` | Enable or disable EKF.
***bool:*** `True` | | 🤖🖥️ | `use_sim` | Whether simulation is used.
***bool:*** `False` | -| 🤖🖥️ | `user_led_animations_file` | Path to a YAML file with a description of the user-defined animations.
***string:*** `''` | +| 🤖🖥️ | `user_led_animations_path` | Path to a YAML file with a description of the user-defined animations.
***string:*** `''` | | 🤖🖥️ | `wheel_config_path` | Path to wheel configuration file.
***string:*** [`{wheel_type}.yaml`](./panther_description/config) | | 🤖🖥️ | `wheel_type` | Specify the wheel type. If the selected wheel type is not 'custom', the wheel_config_path and controller_config_path arguments will be automatically adjusted and can be omitted.
***string:*** `WH01` (for Panther), `WH05` (for Lynx) (choices: `WH01`, `WH02`, `WH04`, `WH05`, `custom`) | | 🖥️ | `x` | Initial robot position in the global 'x' axis.
***float:*** `0.0` | diff --git a/panther_gazebo/CONFIGURATION.md b/panther_gazebo/CONFIGURATION.md index c41cc924c..d83baf523 100644 --- a/panther_gazebo/CONFIGURATION.md +++ b/panther_gazebo/CONFIGURATION.md @@ -33,7 +33,7 @@ To obtain GPS data in Ignition, follow these steps: ## Linear Battery Plugin -It is possible to simulate the battery operation of the Panther robot. By default, this feature is disabled, but you can enable it by setting the `simulate_discharging` parameter to `true` in the `battery_plugin_config.yaml` file or in the file pointed to by the `battery_config_path` parameter. Below, you will find the plugin parameters that enable battery simulation. +It is possible to simulate the battery operation of the Panther robot. By default, this feature is disabled, but you can enable it by setting the `simulate_discharging` parameter to `true` in the `battery_plugin.yaml` file or in the file pointed to by the `battery_config_path` parameter. Below, you will find the plugin parameters that enable battery simulation. - `simulate_discharging` [*bool*, default: **false**]: Enables battery simulation. If set to `true`, the battery will discharge **at a constant rate** (regardless of joint torque), and if it depletes completely, the robot will stop moving. When set to `false`, the battery will not discharge, but the battery status information will still be published on the `battery/battery_status` topic. - `initial_charge_percentage` [*float*, default: **70.0**]: Sets the initial charge percentage of the battery. diff --git a/panther_gazebo/README.md b/panther_gazebo/README.md index a4d3bb85a..7a8189153 100644 --- a/panther_gazebo/README.md +++ b/panther_gazebo/README.md @@ -11,7 +11,7 @@ The package contains a launch file and source files used to run the robot simula ## Configuration Files -- [`battery_plugin_config.yaml`](./config/battery_plugin_config.yaml): Simulated LinearBatteryPlugin configuration. +- [`battery_plugin.yaml`](./config/battery_plugin.yaml): Simulated LinearBatteryPlugin configuration. - [`gz_bridge.yaml`](./config/gz_bridge.yaml): Specify data to exchange between ROS and Gazebo simulation. - [`teleop_with_estop.config`](./config/teleop_with_estop.config): Gazebo layout configuration file, which adds E-Stop and Teleop widgets. diff --git a/panther_gazebo/config/battery_plugin_config.yaml b/panther_gazebo/config/battery_plugin.yaml similarity index 100% rename from panther_gazebo/config/battery_plugin_config.yaml rename to panther_gazebo/config/battery_plugin.yaml diff --git a/panther_gazebo/launch/simulate_robot.launch.py b/panther_gazebo/launch/simulate_robot.launch.py index cf2829481..2bd4f822b 100644 --- a/panther_gazebo/launch/simulate_robot.launch.py +++ b/panther_gazebo/launch/simulate_robot.launch.py @@ -51,7 +51,7 @@ def generate_launch_description(): "This configuration is intended for use in simulations only." ), default_value=PathJoinSubstitution( - [FindPackageShare("panther_gazebo"), "config", "battery_plugin_config.yaml"] + [FindPackageShare("panther_gazebo"), "config", "battery_plugin.yaml"] ), ) diff --git a/panther_lights/CMakeLists.txt b/panther_lights/CMakeLists.txt index 070bd8c17..482023e35 100644 --- a/panther_lights/CMakeLists.txt +++ b/panther_lights/CMakeLists.txt @@ -85,7 +85,8 @@ install( install(TARGETS panther_animation_plugins LIBRARY DESTINATION lib) -install(DIRECTORY animations config launch DESTINATION share/${PROJECT_NAME}) +install(DIRECTORY animations config launch test + DESTINATION share/${PROJECT_NAME}) if(BUILD_TESTING) find_package(ament_cmake_gtest REQUIRED) diff --git a/panther_lights/CONFIGURATION.md b/panther_lights/CONFIGURATION.md index 75f1d4345..df53c7dcd 100644 --- a/panther_lights/CONFIGURATION.md +++ b/panther_lights/CONFIGURATION.md @@ -2,7 +2,7 @@ ## LED Animations -Basic led configuration is loaded from [`led_config.yaml`](config/led_config.yaml) file. It includes definition of robot panels, virtual segments and default animations. Default animations can be found in the table below: +Basic led configuration is loaded from [`{robot_model}_animations.yaml`](config) file. It includes definition of robot panels, virtual segments and default animations. Default animations can be found in the table below: | ID | NAME | PRIORITY | ANIMATION | | :---: | ----------------- | :------: | -------------------------------------------------- | @@ -121,7 +121,7 @@ user_animations: - type: panther_lights::ImageAnimation segments: all animation: - image: $(find my_custom_animation_package)/animations/custom_image.png + image: $(find custom_pkg)/animations/custom_image.png duration: 3 repeat: 1 @@ -133,22 +133,21 @@ user_animations: - type: panther_lights::ImageAnimation segments: front animation: - image: $(find panther_lights)/animations/triangle01_blue.png + image: $(find custom_pkg)/animations/front_custom_image.png duration: 2 repeat: 2 - type: panther_lights::ImageAnimation segments: rear animation: - image: $(find panther_lights)/animations/triangle01_red.png + image: $(find custom_pkg)/animations/rear_custom_image.png duration: 3 repeat: 1 ``` -> [!NOTE] -> ID numbers from 0 to 19 are reserved for system animations. - -> [!NOTE] -> Priority **1** is reserved for crucial system animations. Users can only define animations with priority **2** and **3**. +> [!IMPORTANT] +> +> - ID numbers from 0 to 19 are reserved for system animations. +> - Priority **1** is reserved for crucial system animations. Users can only define animations with priority **2** and **3**. Remember to modify launch command to use user animations: diff --git a/panther_lights/README.md b/panther_lights/README.md index 8c1a7331f..548b04033 100644 --- a/panther_lights/README.md +++ b/panther_lights/README.md @@ -10,7 +10,8 @@ This package contains: ## Configuration Files -- [`led_config.yaml`](./config/led_config.yaml): Defines and describes the appearance and parameters of the animations. +- [`{robot_model}_animations.yaml`](./config): Defines and describes the appearance and parameters of the animations for specific robot. +- [`{robot_model}_driver.yaml`](./config): Defines and describes specific hardware configuration for specific robot. ## ROS Nodes @@ -29,9 +30,9 @@ This node is of type rclcpp_components is responsible for processing animations #### Parameters +- `~animations_config_path` [*string*, default: **$(find panther_lights)/panther_lights/config/{robot_model}_animations.yaml**]: Path to a YAML file with a description of led configuration. This file includes definition of robot panels, virtual segments and default animations. - `~controller_frequency` [*float*, default: **50.0**]: Frequency [Hz] at which the lights controller node will process animations. -- `~led_config_file` [*string*, default: **$(find panther_lights)/panther_lights/config/led_config.yaml**]: Path to a YAML file with a description of led configuration. This file includes definition of robot panels, virtual segments and default animations. -- `~user_led_animations_file` [*string*, default: **None**]: Path to a YAML file with a description of the user defined animations. +- `~user_led_animations_path` [*string*, default: **None**]: Path to a YAML file with a description of the user defined animations. ### LightsDriverNode diff --git a/panther_lights/config/lynx_led_config.yaml b/panther_lights/config/lynx_animations.yaml similarity index 99% rename from panther_lights/config/lynx_led_config.yaml rename to panther_lights/config/lynx_animations.yaml index 0d6b36b67..44f9e2d11 100644 --- a/panther_lights/config/lynx_led_config.yaml +++ b/panther_lights/config/lynx_animations.yaml @@ -18,7 +18,6 @@ segments: channel: 2 led_range: 21-11 - segments_map: all: [fl, fr, rl, rr] front: [fl, fr] diff --git a/panther_lights/config/lynx_driver.yaml b/panther_lights/config/lynx_driver.yaml new file mode 100644 index 000000000..1dc9dca72 --- /dev/null +++ b/panther_lights/config/lynx_driver.yaml @@ -0,0 +1,5 @@ +/**: + lights_driver: + ros__parameters: + channel_1_num_led: 22 + channel_2_num_led: 22 diff --git a/panther_lights/config/panther_led_config.yaml b/panther_lights/config/panther_animations.yaml similarity index 100% rename from panther_lights/config/panther_led_config.yaml rename to panther_lights/config/panther_animations.yaml diff --git a/panther_lights/config/panther_driver.yaml b/panther_lights/config/panther_driver.yaml new file mode 100644 index 000000000..404dfbabf --- /dev/null +++ b/panther_lights/config/panther_driver.yaml @@ -0,0 +1,5 @@ +/**: + lights_driver: + ros__parameters: + channel_1_num_led: 46 + channel_2_num_led: 46 diff --git a/panther_lights/include/panther_lights/lights_controller_node.hpp b/panther_lights/include/panther_lights/lights_controller_node.hpp index ef051bd3a..eb98f16f9 100644 --- a/panther_lights/include/panther_lights/lights_controller_node.hpp +++ b/panther_lights/include/panther_lights/lights_controller_node.hpp @@ -90,9 +90,9 @@ class LightsControllerNode : public rclcpp::Node /** * @brief Adds animations to an unordered map with animations * - * @param user_led_animations_file path to YAML file with user animations description + * @param user_led_animations_path path to YAML file with user animations description */ - void LoadUserAnimations(const std::string & user_led_animations_file); + void LoadUserAnimations(const std::string & user_led_animations_path); /** * @brief Adds animation to an unordered map with animations diff --git a/panther_lights/include/panther_lights/lights_driver_node.hpp b/panther_lights/include/panther_lights/lights_driver_node.hpp index 094dc091a..f1a4b5b5c 100644 --- a/panther_lights/include/panther_lights/lights_driver_node.hpp +++ b/panther_lights/include/panther_lights/lights_driver_node.hpp @@ -83,7 +83,8 @@ class LightsDriverNode : public rclcpp::Node */ void PanelThrottleWarnLog(const std::string panel_name, const std::string message); - int num_led_; + int channel_1_num_led_; + int channel_2_num_led_; double frame_timeout_; bool led_control_granted_; bool led_control_pending_; diff --git a/panther_lights/launch/lights.launch.py b/panther_lights/launch/lights.launch.py index 2f741faa8..9a97853f1 100644 --- a/panther_lights/launch/lights.launch.py +++ b/panther_lights/launch/lights.launch.py @@ -33,13 +33,14 @@ def generate_launch_description(): robot_model = LaunchConfiguration("robot_model") - robot_led_config = PythonExpression(["'", robot_model, "_config.yaml'"]) - led_config_file = LaunchConfiguration("led_config_file") - declare_led_config_file_arg = DeclareLaunchArgument( - "led_config_file", - default_value=PathJoinSubstitution( - [FindPackageShare("panther_lights"), "config", robot_led_config] - ), + lights_pkg = FindPackageShare("panther_lights") + animations_file = PythonExpression(["'", robot_model, "_animation.yaml'"]) + default_animations_path = PathJoinSubstitution([lights_pkg, "config", animations_file]) + + animations_config_path = LaunchConfiguration("animations_config_path") + declare_animations_config_path_arg = DeclareLaunchArgument( + "animations_config_path", + default_value=default_animations_path, description="Path to a YAML file with a description of led configuration.", ) @@ -66,13 +67,15 @@ def generate_launch_description(): description="Whether simulation is used", ) - user_led_animations_file = LaunchConfiguration("user_led_animations_file") - declare_user_led_animations_file_arg = DeclareLaunchArgument( - "user_led_animations_file", + user_led_animations_path = LaunchConfiguration("user_led_animations_path") + declare_user_led_animations_path_arg = DeclareLaunchArgument( + "user_led_animations_path", default_value="", description="Path to a YAML file with a description of the user defined animations.", ) + driver_file = PythonExpression(["'", robot_model, "_driver.yaml'"]) + driver_path = PathJoinSubstitution([lights_pkg, "config", driver_file]) lights_container = ComposableNodeContainer( package="rclcpp_components", name="lights_container", @@ -85,6 +88,7 @@ def generate_launch_description(): name="lights_driver", namespace=namespace, remappings=[("/diagnostics", "diagnostics")], + parameters=[driver_path], extra_arguments=[ {"use_intra_process_comms": True}, ], @@ -96,8 +100,8 @@ def generate_launch_description(): name="lights_controller", namespace=namespace, parameters=[ - {"led_config_file": led_config_file}, - {"user_led_animations_file": user_led_animations_file}, + {"animations_config_path": animations_config_path}, + {"user_led_animations_path": user_led_animations_path}, ], extra_arguments=[ {"use_intra_process_comms": True}, @@ -109,11 +113,11 @@ def generate_launch_description(): ) actions = [ - declare_robot_model_arg, # robot_model is used by led_config_file - declare_led_config_file_arg, + declare_robot_model_arg, # robot_model is used by animations_config_path + declare_animations_config_path_arg, declare_namespace_arg, declare_use_sim_arg, - declare_user_led_animations_file_arg, + declare_user_led_animations_path_arg, lights_container, ] diff --git a/panther_lights/src/lights_controller_node.cpp b/panther_lights/src/lights_controller_node.cpp index fb2d461f5..d77443ef7 100644 --- a/panther_lights/src/lights_controller_node.cpp +++ b/panther_lights/src/lights_controller_node.cpp @@ -48,23 +48,23 @@ LightsControllerNode::LightsControllerNode(const rclcpp::NodeOptions & options) using namespace std::placeholders; - this->declare_parameter("led_config_file"); - this->declare_parameter("user_led_animations_file", ""); + this->declare_parameter("animations_config_path"); + this->declare_parameter("user_led_animations_path", ""); this->declare_parameter("controller_freq", 50.0); - const auto led_config_file = this->get_parameter("led_config_file").as_string(); - const auto user_led_animations_file = this->get_parameter("user_led_animations_file").as_string(); + const auto animations_config_path = this->get_parameter("animations_config_path").as_string(); + const auto user_led_animations_path = this->get_parameter("user_led_animations_path").as_string(); const float controller_freq = this->get_parameter("controller_freq").as_double(); - YAML::Node led_config_desc = YAML::LoadFile(led_config_file); + YAML::Node led_config_desc = YAML::LoadFile(animations_config_path); InitializeLEDPanels(led_config_desc["panels"]); InitializeLEDSegments(led_config_desc["segments"], controller_freq); InitializeLEDSegmentsMap(led_config_desc["segments_map"]); LoadDefaultAnimations(led_config_desc["led_animations"]); - if (user_led_animations_file != "") { - LoadUserAnimations(user_led_animations_file); + if (user_led_animations_path != "") { + LoadUserAnimations(user_led_animations_path); } segment_converter_ = std::make_shared(); @@ -159,12 +159,12 @@ void LightsControllerNode::LoadDefaultAnimations(const YAML::Node & animations_d RCLCPP_INFO(this->get_logger(), "Loaded default animations."); } -void LightsControllerNode::LoadUserAnimations(const std::string & user_led_animations_file) +void LightsControllerNode::LoadUserAnimations(const std::string & user_led_animations_path) { RCLCPP_DEBUG(this->get_logger(), "Loading user's animations."); try { - YAML::Node user_led_animations = YAML::LoadFile(user_led_animations_file); + YAML::Node user_led_animations = YAML::LoadFile(user_led_animations_path); auto user_animations = panther_utils::GetYAMLKeyValue>( user_led_animations, "user_animations"); diff --git a/panther_lights/src/lights_driver_node.cpp b/panther_lights/src/lights_driver_node.cpp index e014695ae..7535955c4 100644 --- a/panther_lights/src/lights_driver_node.cpp +++ b/panther_lights/src/lights_driver_node.cpp @@ -54,10 +54,12 @@ LightsDriverNode::LightsDriverNode(const rclcpp::NodeOptions & options) this->declare_parameter("global_brightness", 1.0); this->declare_parameter("frame_timeout", 0.1); - this->declare_parameter("num_led", 46); + this->declare_parameter("channel_1_num_led", 46); + this->declare_parameter("channel_2_num_led", 46); frame_timeout_ = this->get_parameter("frame_timeout").as_double(); - num_led_ = this->get_parameter("num_led").as_int(); + channel_1_num_led_ = this->get_parameter("channel_1_num_led").as_int(); + channel_2_num_led_ = this->get_parameter("channel_2_num_led").as_int(); const float global_brightness = this->get_parameter("global_brightness").as_double(); channel_1_->SetGlobalBrightness(global_brightness); @@ -133,8 +135,8 @@ void LightsDriverNode::InitializationTimerCB() void LightsDriverNode::ClearLEDs() { - channel_1_->SetPanel(std::vector(num_led_ * 4, 0)); - channel_2_->SetPanel(std::vector(num_led_ * 4, 0)); + channel_1_->SetPanel(std::vector(channel_1_num_led_ * 4, 0)); + channel_2_->SetPanel(std::vector(channel_2_num_led_ * 4, 0)); } void LightsDriverNode::ToggleLEDControl(const bool enable) @@ -211,7 +213,9 @@ void LightsDriverNode::FrameCB( message = "Incorrect image encoding ('" + msg->encoding + "')"; } else if (msg->height != 1) { message = "Incorrect image height " + std::to_string(msg->height); - } else if (msg->width != (std::uint32_t)num_led_) { + } else if ( + msg->width != + (std::uint32_t)(panel_name == "channel_1" ? channel_1_num_led_ : channel_2_num_led_)) { message = "Incorrect image width " + std::to_string(msg->width); } diff --git a/panther_lights/test/files/animation.png b/panther_lights/test/files/animation.png new file mode 100644 index 0000000000000000000000000000000000000000..5886cfe1022b5657090ecdd55075c2cab06b0fb1 GIT binary patch literal 900 zcmeAS@N?(olHy`uVBq!ia0vp^F+jY7gAGXLS#_UbU|?*?baoE#baqxKD9TUE%t>Wn z(3n^|(bnUzgUr$R;H9owvbP+MC_2AQaSS;UxH_PPYhhT%)q_ti>1SM;uw;h?*E&{q zd$HAgdgpdo?ci#9z}~UCd-9_0DL?ivyP$Ne`ElKz-QRaqvvZu)y1Zszp~K}|@8k-mg#)YteagBf&=uLoaK_ zpV+yk=-#6>p|95z`~N!>;20nI%<8P*k_{cI9s&y&^l`1)FmXYs`cbF0Z9!}!HAT7){FbZ@mg~5~#GIX%Keu*{ z9Yf?Rty*Ro8K#dysq3rvSl_sPdw;ss-@goYQ;H^KuYTVTj25;eZ+91l|3DUlv3kvC zAjMhW5n0T@z;^_M8K-LVNdpDhOFVsD*`G7toiF*M zNgjybgRsPtruh;PJEZlv-;4b@!0=EQuZnH^mRYo{~G z?9gh;2deMqX|UE@#lA0%;SO)OZNdH%$jJ@9ACvna6CyxU|i!N3mWm$QM4 z-~PayO^h$bud9{2V)BDVTX#QP#cpTpkvl_a&xvU> r%HM7lmlMka`vB}1klU!jn0k@lcD264o%Ls~fg;b-)z4*}Q$iB}%Kv?@ literal 0 HcmV?d00001 diff --git a/panther_lights/test/integration/panther_lights.test.py b/panther_lights/test/integration/panther_lights.test.py index fafd6bf19..25fa0e95c 100644 --- a/panther_lights/test/integration/panther_lights.test.py +++ b/panther_lights/test/integration/panther_lights.test.py @@ -36,14 +36,15 @@ def generate_test_description(): - led_config_file = ( - PathJoinSubstitution([FindPackageShare("panther_lights"), "config", "led_config.yaml"]), + # TODO: Fix the path for specific robot model + animations_config_path = ( + PathJoinSubstitution([FindPackageShare("panther_lights"), "config", "animations.yaml"]), ) lights_controller_node = Node( package="panther_lights", executable="lights_controller_node", - parameters=[{"led_config_file": led_config_file}], + parameters=[{"animations_config_path": animations_config_path}], ) lights_driver_node = Node( diff --git a/panther_lights/test/unit/animation/test_image_animation.cpp b/panther_lights/test/unit/animation/test_image_animation.cpp index 9437bae1b..2409a30c3 100644 --- a/panther_lights/test/unit/animation/test_image_animation.cpp +++ b/panther_lights/test/unit/animation/test_image_animation.cpp @@ -94,21 +94,21 @@ TEST_F(TestImageAnimation, ParseImagePath) EXPECT_EQ(this->test_image_path, animation_->ParseImagePath(this->test_image_path)); // test ROS package path - image_path = "$(find invalid_ros_package)/animations/strip01_red.png"; + image_path = "$(find invalid_ros_package)/test/files/animation.png"; EXPECT_THROW(animation_->ParseImagePath(image_path), std::runtime_error); // invalid substitution - image_path = "$(fin panther_lights)/animations/strip01_red.png"; + image_path = "$(fin panther_lights)/test/files/animation.png"; EXPECT_THROW(animation_->ParseImagePath(image_path), std::runtime_error); - image_path = "$(find panther_lights/animations/strip01_red.png"; + image_path = "$(find panther_lights/test/files/animation.png"; EXPECT_THROW(animation_->ParseImagePath(image_path), std::runtime_error); // following ones may not work if ROS package is not build or sourced - image_path = "$(find panther_lights)/animations/strip01_red.png"; + image_path = "$(find panther_lights)/test/files/animation.png"; EXPECT_NO_THROW(animation_->ParseImagePath(image_path)); // multiple spaces after find syntax - image_path = "$(find panther_lights)/animations/strip01_red.png"; + image_path = "$(find panther_lights)/test/files/animation.png"; EXPECT_NO_THROW(animation_->ParseImagePath(image_path)); } diff --git a/panther_lights/test/unit/led_components/test_led_animation.cpp b/panther_lights/test/unit/led_components/test_led_animation.cpp index 64dd9b024..51dbc58d4 100644 --- a/panther_lights/test/unit/led_components/test_led_animation.cpp +++ b/panther_lights/test/unit/led_components/test_led_animation.cpp @@ -54,7 +54,7 @@ TestLEDAnimation::TestLEDAnimation() anim_desc.segments = {kTestSegmentName1, kTestSegmentName2}; anim_desc.type = "panther_lights::ImageAnimation"; anim_desc.animation = - YAML::Load("{image: $(find panther_lights)/animations/triangle01_red.png, duration: 2.0}"); + YAML::Load("{image: $(find panther_lights)/test/files/animation.png, duration: 2.0}"); panther_lights::LEDAnimationDescription led_anim_desc; led_anim_desc.id = 0; diff --git a/panther_lights/test/unit/led_components/test_led_animations_queue.cpp b/panther_lights/test/unit/led_components/test_led_animations_queue.cpp index bdd9386de..4eb8d8c79 100644 --- a/panther_lights/test/unit/led_components/test_led_animations_queue.cpp +++ b/panther_lights/test/unit/led_components/test_led_animations_queue.cpp @@ -61,7 +61,7 @@ panther_lights::LEDAnimation TestLEDAnimationsQueue::CreateLEDAnimation( anim_desc.segments = {"segment_1", "segment_2"}; anim_desc.type = "panther_lights::ImageAnimation"; anim_desc.animation = - YAML::Load("{image: $(find panther_lights)/animations/triangle01_red.png, duration: 2.0}"); + YAML::Load("{image: $(find panther_lights)/test/files/animation.png, duration: 2.0}"); panther_lights::LEDAnimationDescription led_anim_desc; led_anim_desc.id = 0; diff --git a/panther_lights/test/unit/led_components/test_led_segment.cpp b/panther_lights/test/unit/led_components/test_led_segment.cpp index 9e20ff0dd..82fbec3e2 100644 --- a/panther_lights/test/unit/led_components/test_led_segment.cpp +++ b/panther_lights/test/unit/led_components/test_led_segment.cpp @@ -189,7 +189,7 @@ TEST_F(TestLEDSegment, SetAnimation) { // test each known animtion type const auto image_anim_desc = YAML::Load( - "{image: $(find panther_lights)/animations/triangle01_red.png, " + "{image: $(find panther_lights)/test/files/animation.png, " "duration: 2}"); const auto charging_anim_desc = YAML::Load("{duration: 2}"); @@ -203,7 +203,7 @@ TEST_F(TestLEDSegment, SetAnimation) TEST_F(TestLEDSegment, SetAnimationRepeating) { const auto anim_desc = YAML::Load( - "{image: $(find panther_lights)/animations/triangle01_red.png, " + "{image: $(find panther_lights)/test/files/animation.png, " "duration: 2}"); ASSERT_NO_THROW(led_segment_->SetAnimation("panther_lights::ImageAnimation", anim_desc, false)); @@ -224,7 +224,7 @@ TEST_F(TestLEDSegment, UpdateAnimationAnimationNotSet) TEST_F(TestLEDSegment, UpdateAnimation) { const auto anim_desc = YAML::Load( - "{image: $(find panther_lights)/animations/triangle01_red.png, " + "{image: $(find panther_lights)/test/files/animation.png, " "duration: 2}"); ASSERT_NO_THROW(led_segment_->SetAnimation("panther_lights::ImageAnimation", anim_desc, false)); EXPECT_NO_THROW(led_segment_->UpdateAnimation()); @@ -240,7 +240,7 @@ int main(int argc, char ** argv) TEST_F(TestLEDSegment, ResetDefaultAnimationWhenNewArrive) { const auto anim_desc = YAML::Load( - "{image: $(find panther_lights)/animations/triangle01_red.png, " + "{image: $(find panther_lights)/test/files/animation.png, " "duration: 2}"); ASSERT_NO_THROW(led_segment_->SetAnimation("panther_lights::ImageAnimation", anim_desc, true)); diff --git a/panther_lights/test/unit/led_components/test_segment_converter.cpp b/panther_lights/test/unit/led_components/test_segment_converter.cpp index ef1a7747c..807f9440d 100644 --- a/panther_lights/test/unit/led_components/test_segment_converter.cpp +++ b/panther_lights/test/unit/led_components/test_segment_converter.cpp @@ -63,9 +63,7 @@ YAML::Node TestSegmentConverter::CreateSegmentDescription( YAML::Node TestSegmentConverter::CreateImageAnimationDescription() { - return YAML::Load( - "{image: $(find panther_lights)/animations/triangle01_red.png, " - "duration: 2}"); + return YAML::Load("{image: $(find panther_lights)/test/files/animation.png, duration: 2}"); } TEST_F(TestSegmentConverter, ConvertInvalidChannel) diff --git a/panther_lights/test/unit/test_lights_controller_node.cpp b/panther_lights/test/unit/test_lights_controller_node.cpp index 7a27f3a40..99b0a0690 100644 --- a/panther_lights/test/unit/test_lights_controller_node.cpp +++ b/panther_lights/test/unit/test_lights_controller_node.cpp @@ -77,18 +77,18 @@ class TestLightsControllerNode : public testing::Test static constexpr char kTestSegmentName[] = "test"; static constexpr char kTestSegmentLedRange[] = "0-9"; - std::filesystem::path led_config_file_; + std::filesystem::path animations_config_path_; std::shared_ptr lights_controller_node_; }; TestLightsControllerNode::TestLightsControllerNode() { - led_config_file_ = testing::TempDir() + "/led_config.yaml"; + animations_config_path_ = testing::TempDir() + "/animations.yaml"; - CreateLEDConfig(led_config_file_); + CreateLEDConfig(animations_config_path_); std::vector params; - params.push_back(rclcpp::Parameter("led_config_file", led_config_file_)); + params.push_back(rclcpp::Parameter("animations_config_path", animations_config_path_)); rclcpp::NodeOptions options; options.parameter_overrides(params); @@ -96,7 +96,10 @@ TestLightsControllerNode::TestLightsControllerNode() lights_controller_node_ = std::make_shared(options); } -TestLightsControllerNode::~TestLightsControllerNode() { std::filesystem::remove(led_config_file_); } +TestLightsControllerNode::~TestLightsControllerNode() +{ + std::filesystem::remove(animations_config_path_); +} void TestLightsControllerNode::CreateLEDConfig(const std::filesystem::path file_path) { @@ -113,7 +116,7 @@ void TestLightsControllerNode::CreateLEDConfig(const std::filesystem::path file_ segments_map["test"] = std::vector(1, kTestSegmentName); YAML::Node animation; - animation["image"] = "$(find panther_lights)/animations/triangle01_red.png"; + animation["image"] = "$(find panther_lights)/test/files/strip01_red.png"; animation["duration"] = 2; YAML::Node animation_desc; @@ -133,14 +136,14 @@ void TestLightsControllerNode::CreateLEDConfig(const std::filesystem::path file_ led_animations.push_back(led_animation_0); led_animations.push_back(led_animation_1); - YAML::Node led_config; - led_config["panels"] = std::vector(1, panel); - led_config["segments"] = std::vector(1, segment); - led_config["segments_map"] = segments_map; - led_config["led_animations"] = led_animations; + YAML::Node animations_config; + animations_config["panels"] = std::vector(1, panel); + animations_config["segments"] = std::vector(1, segment); + animations_config["segments_map"] = segments_map; + animations_config["led_animations"] = led_animations; YAML::Emitter out; - out << led_config; + out << animations_config; std::ofstream fout(file_path); if (fout.is_open()) { diff --git a/panther_lights/test/unit/test_lights_driver_node.cpp b/panther_lights/test/unit/test_lights_driver_node.cpp index 9a20b0f5e..09918acfd 100644 --- a/panther_lights/test/unit/test_lights_driver_node.cpp +++ b/panther_lights/test/unit/test_lights_driver_node.cpp @@ -55,7 +55,8 @@ panther_lights::LightsDriverNode::LightsDriverNode( channel_2_(channel_2), diagnostic_updater_(this) { - num_led_ = 46; + channel_1_num_led_ = 46; + channel_2_num_led_ = 46; frame_timeout_ = 0.1; }; @@ -83,7 +84,10 @@ class DriverNodeWrapper : public panther_lights::LightsDriverNode return LightsDriverNode::FrameCB(msg, panel, last_time, panel_name); } - int GetNumLed() const { return num_led_; } + int GetNumLed(const std::string & panel_name) const + { + return panel_name == "channel_1" ? channel_1_num_led_ : channel_2_num_led_; + } double GetTimeout() const { return frame_timeout_; } bool GetLedControlGranted() const { return led_control_granted_; } bool GetLedControlPending() const { return led_control_pending_; } @@ -98,7 +102,7 @@ class TestLightsDriverNode : public testing::Test TestLightsDriverNode(); ~TestLightsDriverNode() {}; - ImageMsg::UniquePtr CreateValidImageMsg(); + ImageMsg::UniquePtr CreateValidImageMsg(const std::string & panel_name); std::shared_future> CreateSetBoolSrvFuture(bool request_data, bool response_success); @@ -115,7 +119,7 @@ TestLightsDriverNode::TestLightsDriverNode() lights_driver_node_ = std::make_unique(channel_1_, channel_2_); } -ImageMsg::UniquePtr TestLightsDriverNode::CreateValidImageMsg() +ImageMsg::UniquePtr TestLightsDriverNode::CreateValidImageMsg(const std::string & panel_name) { ImageMsg::UniquePtr msg(new ImageMsg); @@ -123,7 +127,7 @@ ImageMsg::UniquePtr TestLightsDriverNode::CreateValidImageMsg() msg->header.stamp = lights_driver_node_->now(); msg->header.frame_id = "image_frame"; msg->height = 1; - msg->width = lights_driver_node_->GetNumLed(); + msg->width = lights_driver_node_->GetNumLed(panel_name); msg->encoding = sensor_msgs::image_encodings::RGBA8; msg->is_bigendian = false; msg->step = msg->width * 4; @@ -158,11 +162,13 @@ TEST_F(TestLightsDriverNode, TestInitialization) TEST_F(TestLightsDriverNode, ClearLEDs) { - auto num_led = lights_driver_node_->GetNumLed(); - std::vector zero_frame(num_led * 4, 0); + auto num_led_1 = lights_driver_node_->GetNumLed("channel_1"); + auto num_led_2 = lights_driver_node_->GetNumLed("channel_2"); + std::vector zero_frame_1(num_led_1 * 4, 0); + std::vector zero_frame_2(num_led_2 * 4, 0); - EXPECT_CALL(*channel_1_, SetPanel(zero_frame)).Times(1); - EXPECT_CALL(*channel_2_, SetPanel(zero_frame)).Times(1); + EXPECT_CALL(*channel_1_, SetPanel(zero_frame_1)).Times(1); + EXPECT_CALL(*channel_2_, SetPanel(zero_frame_2)).Times(1); lights_driver_node_->ClearLEDs(); } @@ -203,7 +209,7 @@ TEST_F(TestLightsDriverNode, ToggleLEDControlCBDisabled) TEST_F(TestLightsDriverNode, FrameCBSuccessNoControl) { - auto msg = CreateValidImageMsg(); + auto msg = CreateValidImageMsg("channel_1"); EXPECT_CALL(*channel_1_, SetPanel(testing::_)).Times(0); @@ -212,7 +218,8 @@ TEST_F(TestLightsDriverNode, FrameCBSuccessNoControl) TEST_F(TestLightsDriverNode, FrameCBSuccess) { - auto msg = CreateValidImageMsg(); + auto msg_1 = CreateValidImageMsg("channel_1"); + auto msg_2 = CreateValidImageMsg("channel_2"); auto future = CreateSetBoolSrvFuture(true, true); lights_driver_node_->ToggleLEDControlCB(std::move(future)); @@ -220,13 +227,13 @@ TEST_F(TestLightsDriverNode, FrameCBSuccess) EXPECT_CALL(*channel_1_, SetPanel(testing::_)).Times(1); EXPECT_CALL(*channel_2_, SetPanel(testing::_)).Times(1); - lights_driver_node_->FrameCB(msg, channel_1_, msg->header.stamp, "channel_1"); - lights_driver_node_->FrameCB(msg, channel_2_, msg->header.stamp, "channel_2"); + lights_driver_node_->FrameCB(msg_1, channel_1_, msg_1->header.stamp, "channel_1"); + lights_driver_node_->FrameCB(msg_2, channel_2_, msg_2->header.stamp, "channel_2"); } TEST_F(TestLightsDriverNode, FrameCBTimeout) { - auto msg = CreateValidImageMsg(); + auto msg = CreateValidImageMsg("channel_1"); auto timeout = lights_driver_node_->GetTimeout(); // Set timestamp to exceed timeout @@ -242,7 +249,7 @@ TEST_F(TestLightsDriverNode, FrameCBTimeout) TEST_F(TestLightsDriverNode, FrameCBPast) { - auto msg = CreateValidImageMsg(); + auto msg = CreateValidImageMsg("channel_1"); // Set last_time to be younger than msg timestamp auto future = CreateSetBoolSrvFuture(true, true); @@ -255,7 +262,7 @@ TEST_F(TestLightsDriverNode, FrameCBPast) TEST_F(TestLightsDriverNode, FrameCBEncoding) { - auto msg = CreateValidImageMsg(); + auto msg = CreateValidImageMsg("channel_1"); // Set incorrect encoding msg->encoding = sensor_msgs::image_encodings::RGB8; @@ -270,7 +277,7 @@ TEST_F(TestLightsDriverNode, FrameCBEncoding) TEST_F(TestLightsDriverNode, FrameCBHeight) { - auto msg = CreateValidImageMsg(); + auto msg = CreateValidImageMsg("channel_1"); // Set incorrect height msg->height = 2; @@ -285,10 +292,10 @@ TEST_F(TestLightsDriverNode, FrameCBHeight) TEST_F(TestLightsDriverNode, FrameCBWidth) { - auto msg = CreateValidImageMsg(); + auto msg = CreateValidImageMsg("channel_1"); // Set incorrect width - msg->width = lights_driver_node_->GetNumLed() + 1; + msg->width = lights_driver_node_->GetNumLed("channel_1") + 1; auto future = CreateSetBoolSrvFuture(true, true); lights_driver_node_->ToggleLEDControlCB(std::move(future)); diff --git a/panther_manager/CONFIGURATION.md b/panther_manager/CONFIGURATION.md index 3317e43a2..6454c886a 100644 --- a/panther_manager/CONFIGURATION.md +++ b/panther_manager/CONFIGURATION.md @@ -5,7 +5,7 @@ For more information regarding shutdown behavior, refer to `ShutdownSingleHost` BT node in the [Actions](#actions) section. An example of a shutdown hosts YAML file can be found below. ``` yaml -# My shutdown_hosts_config.yaml +# My shutdown_hosts.yaml hosts: # Intel NUC, user computer - ip: 10.15.20.3 diff --git a/panther_manager/README.md b/panther_manager/README.md index f58327f03..718abece8 100644 --- a/panther_manager/README.md +++ b/panther_manager/README.md @@ -17,7 +17,7 @@ This package contains: - [`shutdown.xml`](./behavior_trees/shutdown.xml): BehaviorTree for initiating shutdown procedures. - [`lights_manager.yaml`](./config/lights_manager.yaml): Contains parameters for the `lights_manager` node. - [`safety_manager.yaml`](./config/safety_manager.yaml): Contains parameters for the `safety_manager` node. -- [`shutdown_hosts_config.yaml`](./config/shutdown_hosts_config.yaml): List with all hosts to request shutdown. +- [`shutdown_hosts.yaml`](./config/shutdown_hosts.yaml): List with all hosts to request shutdown. ## ROS Nodes diff --git a/panther_manager/config/shutdown_hosts_config.yaml b/panther_manager/config/shutdown_hosts.yaml similarity index 100% rename from panther_manager/config/shutdown_hosts_config.yaml rename to panther_manager/config/shutdown_hosts.yaml diff --git a/panther_manager/launch/manager.launch.py b/panther_manager/launch/manager.launch.py index 510fb2834..0aaf5385b 100644 --- a/panther_manager/launch/manager.launch.py +++ b/panther_manager/launch/manager.launch.py @@ -62,7 +62,7 @@ def generate_launch_description(): [ FindPackageShare("panther_manager"), "config", - "shutdown_hosts_config.yaml", + "shutdown_hosts.yaml", ] ), description="Path to file with list of hosts to request shutdown.", From 4f3454e6ffdc24f0a85c33363f6283f25114085e Mon Sep 17 00:00:00 2001 From: rafal-gorecki Date: Mon, 23 Sep 2024 17:04:38 +0200 Subject: [PATCH 03/12] Add animation and fix some typos --- .../animations/lynx/battery_critical.png | Bin 0 -> 7009 bytes panther_lights/animations/lynx/battery_low.png | Bin 0 -> 7403 bytes .../animations/lynx/strip01_purple.png | Bin 0 -> 964 bytes panther_lights/animations/lynx/strip01_red.png | Bin 0 -> 900 bytes .../animations/lynx/triangle01_blue.png | Bin 0 -> 6204 bytes .../animations/lynx/triangle01_cyan.png | Bin 0 -> 7186 bytes .../animations/lynx/triangle01_orange.png | Bin 0 -> 7081 bytes .../animations/lynx/triangle01_purple.png | Bin 0 -> 6752 bytes .../animations/lynx/triangle01_red_v2.png | Bin 8069 -> 0 bytes .../animations/lynx/triangle01_yellow.png | Bin 0 -> 7268 bytes panther_lights/config/lynx_animations.yaml | 2 +- panther_lights/config/lynx_driver.yaml | 8 +++----- panther_lights/config/panther_driver.yaml | 8 +++----- panther_lights/launch/lights.launch.py | 11 +++++------ 14 files changed, 12 insertions(+), 17 deletions(-) create mode 100644 panther_lights/animations/lynx/battery_critical.png create mode 100644 panther_lights/animations/lynx/battery_low.png create mode 100644 panther_lights/animations/lynx/strip01_purple.png create mode 100644 panther_lights/animations/lynx/strip01_red.png create mode 100644 panther_lights/animations/lynx/triangle01_blue.png create mode 100644 panther_lights/animations/lynx/triangle01_cyan.png create mode 100644 panther_lights/animations/lynx/triangle01_orange.png create mode 100644 panther_lights/animations/lynx/triangle01_purple.png delete mode 100644 panther_lights/animations/lynx/triangle01_red_v2.png create mode 100644 panther_lights/animations/lynx/triangle01_yellow.png diff --git a/panther_lights/animations/lynx/battery_critical.png b/panther_lights/animations/lynx/battery_critical.png new file mode 100644 index 0000000000000000000000000000000000000000..6cd7dda869ef44ec6cf601b983c8892aca45607a GIT binary patch literal 7009 zcmeHLdpwle*B>+PLPZxzG`S=*=8l;RBOJs?NaWU-iy6$t%wWiE>QpBxT`9SY4&~_3 z4Rvyfgi<1kC`>80$|Wj=yw9j}PUn4p|D4a~{r%T`KF{;)XYaMXYpw5Edp~>60S|X4 zb=6g>AP`91#o56Vc$x#(b!A21p0%%+1p+A@iSzaqdQxHxcziB{6+t%;#`5R}bPpIw`_+S-OEHYNpb>C=kW z$i~b+b%?6AY`AEdSvA?IuT`Zse8}0#Z_MFsw(~2&x+<-ymhuoz*=&MZe^2+!tdgS5 z^Tb0JFMQGXGVxS(2p+1ptSeJH-}}8fX{>Q~wEL>Qv-0(lcL4|DFO*v@1%1+U??W`~ z71)>cX?)(hEcIsS>({VZ+P#;0XKhIj`WpL!H18(0G(qP2))kGNo{dX*5?Zu4Ns?qc z_mTA)@r_!t_$C*;EqcnDU$I>Cf-L}od z?9$wRx8sY+(MN6_xTBq5?gMY5jl60Z-Kb}J=|<_T*YQltlViSZS0hp}))%(<1Rcmb zb_zCeNB?GBt_|-2dGCoAYSqNqlz>Yr{pgsRIt|&vAdfk@>DP0UQL)VU*z+#wyre>{B(cBdoaigE1LJ=KgWg$3ML4DkF5@L3_4bm8K3MLbNjW#8xNW z1ZXa+Jv4{j(ZvY9B7ClIcJazc*oCpuqiyAHH;!F-&8g7OkH)UvnE1~0d`|Rd%kW|H z)7&xJo$#vP@76ui^R4#l4>Jw+$`3b5#P30>r0=W@P+eRa@F0ZD;GeF@s^8cDo0{F{ zR}lsGRxavxe_@gkx#DHr5Pfw11zdY(ujQxU(`p$vY-yvpm2-#7qVBcEubiPhSHNxP zYMkq_<{;M^)Vz7cA@90^i*ru>C8g!^>-wbQZn0CD>5FFX7AGfvmV2 z%h5fFObf_J9zmxkzf#}oTxg%AcJv%E9%fp_ zgD$>qg1Fp5cDv4yuR@CdyDs$Qh$}fprk{{!*BSEbuLqplywQ(Z0_xgQj#;rLG09`| zOxU^>Q)+3!uy*;iw=b*jrmCkK1w1mj-FRAjjDObOHE?pO?D%_JSBrOko=wXd6PylQ zRdXtJ8W)_u6n9BnUb2#YI`2ew+MzQ8$IM(GtIRQHu(XXA{s2#0zS68fzc{4X&<^go zwP9b}!3QkkzywL}V^gz2L0a@WyBFbFkBY9Iy_tv6{T+Kuu`3Jjq;ceORukV{f(o8tLjVBB*)s&=41p{pOta zF2gL>XGf)Gmtwk|jwOsLD6_RyXV%j4y-qaiSRFkf&wKiF>7I`S&DafxdCQxXDX*-T zwrW^w>OFk}JHR_M(B}N;kYRiZ*QIx)+Rx^v=_V)rq*wjTbxysE^CeI86Py$vwIc%u z_r~kbH629IZ(dfqS=d+JKcCuwpb|L$bn?`AM zOreq{>&o~%?#bH*^l;4n%W}6#U$Qdwe4k6HtFC5S1UWj5fKs*St>rCI`w1U(tREVa zjJgdk&kTsx$5-%V$OsJ?jhDwI`Df9;w#g|ON5ac8yC_@^i2 zGxK}Mac|->Iy%%`5dLrO4QMf3rB@prlW0{dRJ)F$l_f8YV_XA6jUHzk?T;d`TZ=l8 zg)ZYOC^V0@*R^-J#$%VXI~6|NERIWR7~9rIMco_-_0jTu2ssr}VoEd{$i8Lt%gvB8 ziXQ?7D8_j|6-9 z|5MPod`qHgp0rrmvfZKIIp{%gv*Kmi{ZQM4Hv8FU?v){HKcD=l0zZa?Jtb7RhSysZ z|5Rt!wL2+?`BuL*$%{7>yki;>?5S{!=_}C(f#mkF?Cm{V?Ct;jHUnSetc0UP=Q`5r z`e3hm%_5EE+L3oWvSBGH%H})vLcNvCHeJv#&PcR7zR$3}ek%`dHGSDPiWk}OxOUrO zd0SGJUY2%X{_T0Ay~{7JS^crUr>e1MBdJjP6r=2*Tqftt1k=IooKJoEcA-SG=TvRs zeHhjKSO}9)J^H-=b>OK`obAWKAZka*|>4C8i2v_}-yZeca1rR3-CbD-sbliLl0 ziFKXJ()z4I1DA^!t!}pm5A3-eQZ7EJ$iRE8%Q4jWEz|werZ(!y$>pKN9wBAB-mOq< z``m=?WNAQC9AS35l@*L$ZcRRfEGC#Pe^IK>dZEvoTl$AK|5fds%gIpeof7?7&BT~+ zx^Y8QK1rUL5Sf*>R>EFUn65WC^CYs!Bza!vdfV$SAquCy7*+*zZgL{ESnwhPJ5La$ ze5IizG|em8$d2tC7`*k5f%iU78;2oBBqbr1HMMJzSp{$28;^0gZ{GG{ z%DyCm#wPh)X~@GcU>CKD1?-l5$!-KHmu*g=aYN|lA~p}$O@Tnxwjv&d8cr7)gwR7- z93phA;wIF9MI%DD-(%Hv(#~AR-JWLVd{|2KHP&-2iKjHAli7MXYEv)JE07nona8JRN@e1_8Vg zp-iEWM?fHAVq(l=Fy>r-C<2AY;}J+S0*!_P5^zB*M@SLDIf8XEh_4t9bODvm;t5$? zj)4r562grV5}{CF+~80D*gP`%FL;jN8w&s*2oZ&cK$#;EY&PP14S~=x8UXp`(0|kr zcmtbGgeP6Vjp9@3j?r|EaNYM1H0odayeNLeLO3)kf*wI<1EK=JD(W95om|Kse`&}l z2xYN(3t9l#|Bw{27=M%X58q@X3*mh42%!EK?mwjejD0~EkRp=_4qR%K%sm$eB2;Fd zK;u$bG{QoYPGz8|7%U3Tz*|z`SQL&9$787&IGswNpy=2TDh)&V4$6fi5K=f)x(o^c zH)jDjmKGs+B$a9fr()8Zrl<4mPZx);GC8WsML|LLOQAmsh25*J7v_PZ& z7V@F<1wbXrFi}Wz%vW4lS_nWe0I?KVodN(08bB-rdp?~a(Sxkze1wPJsy4!jOT%LfH~1)UQSalxR9_!4RPLb%@HOa6;+8 z{Qg!@fA+KfL$Ywl5Q`8b1;{c3je=wGG(6lYgkcHCVNnb`9Z#{cME@^z0hb|+q44Q; zp+KZSG(Z6@L}RdiflAYV`VzyW%XmVfv2Y|Fj>dSSED1;?0fRR~qJah!@hxD4Y*zmn zu{GlVaALh6@ZB;1=zZ-2mKR{PLj1K{edA0<t8YO zuY`Y8*AKe>6$AfD_(yg9ztN@o_koAb0d_$#z;VW(9=RAe3Mq!TIyo#Hia?+2E0Tbg z3eVY300L>;mR)iu%`|j@P9>oW*->doWrZfl#Mkw{I|wA7>EdALE$V)oeUGDMw-|I! zchGTZ5LkYkrE>SBbmxIT{^*B=eNN=E=vrPiHut#36D=g?xp2L_yXs0i&4EoW$R4~ zLvQmD0SY&Kb^Cq9KH|P9n_l!z|BW6?rX5>GqZ&ddmy3OL5ZQiM$g({d4`AKml$vnH z@?ug&icLy-;#*R^w7~UdwB&I^6}TAuagq0;Q9b6#$QIIt8X{yHYIF$`cYV8Ln>0u4 zqx(^{bk#F64_tqTxF~s-{0{ZeWrZn`X{2p6MDR8o@L%|<>rs*o(lz2D9Yjx0k-E2@ zbxh0!3lAJ`cr+dB5!G*maV1NNq;01imjbdh#&0U#k43|6!CHkIt_z1VLOix}>?rU#a_%Xn54eMPe*1sPM;&Efg}|a9$~fg#@6lE>h@T9l+nl zbeE88!#_0d2eUZ=H>NaYy;r6N<--^O8$GmmZ%Jve8h_xe(h&gZ7LWStcB(!S7BZE> zz$JP^c?FTpq>r%LG6>GHWLcrcumoWToC5!eeq09H~?9Y^!}dJ$Eup}^e>N9N5U$F!((+7Vps56eRF9W zsi(F;ybqM2xT@j0p-0SkCaI?;91?{K(ke6)ktJ&nx`LyWG89KtfsTqumShxAsauIq z$I8pZc`QKUBc!=1+Duz?chpCj2i(@nvbS=)?X;0RkU149U{DhhbYp5iCP$aKe*74z zE*UV_Byy4D)wqJyS=J`4Jn0|eePDzNHf!P;sZKnoxT<5?L$bD309IE5l$`tV;(hWh zD%jEqvUs0@zADxb7`}G&&__t%LDs>#fu7<^Qu_-3=ZEIG3>Di3%Vrp*7Pvj%-xTPY zG@ZxqY_na}|5_ZBCO2C`vfp!2DXzocu}(Kwb1DobjZq-1>YpRczYx|}8@6&`^X8LU z_r}0`Evr?htZQ?@wvA|S^EMAWq}q7$*OeOvVHewM8J`r=>V0drcWi0v&xKtKtJYJS z-HJ}KvKarOa&T$9cCLoWxJo=Yx90mtTFfjY$OT6FC3hEFwywE2x;vC?+PV9G0M>wA A+yDRo literal 0 HcmV?d00001 diff --git a/panther_lights/animations/lynx/battery_low.png b/panther_lights/animations/lynx/battery_low.png new file mode 100644 index 0000000000000000000000000000000000000000..1ee676a14c048c108d176178509c4b0fe2c9a4cb GIT binary patch literal 7403 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 YP`#+4^}w;5nawQ~Yi?^+X5tWn z(3n^|(bnUzgUr$R;H9owvbP+MC_2AQaSS;UxH_PPYhhT%)q_ti>1SM;uw;h?*E&{q zd$HAgdgpdo?ci#9z}~UCd-9_0DL?ivyP$Ne`ElKz-QRaqvvZu)y1Zszp~K}|@8k-mg#)YteagBf&=uLoaK_ zpV+yk=-#6>p|95z`~N!>;20nI%<8P*k_{cI9s&y&^l`1)FmXYs`cbF0Z9!}!HAT7){FbZ@mg~5~#GIX%Keu*{ z9Yf?Rty*Ro8K#dysq3rvSl_sPdw;ss-@goYQ;H^KuYTVTj25;eZ+90U4Fo@(ch>_c z&H|6fVg?4jBOuH;Rhv&5D9B#o>Fdh=oQa>CLF3M~*6qNUJm~4-7*cWT?cK<{LjeLV z7tJKjC`|dQZ^CJOlSzIpSCv&cr~A@vj*c@|y$bEx>ck+kqk&ocLw`=(E0=?Z*yDa| z+^3;(u)K7^1eW{P`kaJng1KAYcv=RXm?y$repolA_dzw+&Hir(4zF*G=JM-mUsiMJ zi=3YNQBTHqOCl@^Dl?*X+++J5%k^R6!Sn~2A9!0;e(Xx)I?&Em9(3qIHkaoI(E{_D z53Rpv*Qg&obd}AHaeD!GxcUzl#vcbBu--Y;xLS9;#(_p|ivmV=y$6_#|5yKf>R;8s z&-*TZW28mF)+T#Rm4ovS=-xSWmGj?%gon({_OJX7dP-J3JaG7dIai)VL22Xtxl>Gj zOm!0a!zT0N!2@xi8?+0!+1H($T(m6Vq1>#ZpgAIzn)00gycMg1YNiXZ?vL0p`O!kn z_YcL^eLryitM5T|U-Ot+^{4Gl8!}f;p1+axbM)^ohfe!X)CGrK!2>2f>M?}=GVaTX Vh&=Qs{S7GcJzf1=);T3K0RXWBpEm#i literal 0 HcmV?d00001 diff --git a/panther_lights/animations/lynx/strip01_red.png b/panther_lights/animations/lynx/strip01_red.png new file mode 100644 index 0000000000000000000000000000000000000000..5886cfe1022b5657090ecdd55075c2cab06b0fb1 GIT binary patch literal 900 zcmeAS@N?(olHy`uVBq!ia0vp^F+jY7gAGXLS#_UbU|?*?baoE#baqxKD9TUE%t>Wn z(3n^|(bnUzgUr$R;H9owvbP+MC_2AQaSS;UxH_PPYhhT%)q_ti>1SM;uw;h?*E&{q zd$HAgdgpdo?ci#9z}~UCd-9_0DL?ivyP$Ne`ElKz-QRaqvvZu)y1Zszp~K}|@8k-mg#)YteagBf&=uLoaK_ zpV+yk=-#6>p|95z`~N!>;20nI%<8P*k_{cI9s&y&^l`1)FmXYs`cbF0Z9!}!HAT7){FbZ@mg~5~#GIX%Keu*{ z9Yf?Rty*Ro8K#dysq3rvSl_sPdw;ss-@goYQ;H^KuYTVTj25;eZ+91l|3DUlv3kvC zAjMhW5n0T@z;^_M8K-LVNdpDhOFVsD*`G7toiF*M zNgjybgRsPtruh;PJEZlv-;4b@!0=EQuZnH^mRYo{~G z?9gh;2deMqX|UE@#lA0%;SO)OZNdH%$jJ@9ACvna6CyxU|i!N3mWm$QM4 z-~PayO^h$bud9{2V)BDVTX#QP#cpTpkvl_a&xvU> r%HM7lmlMka`vB}1klU!jn0k@lcD264o%Ls~fg;b-)z4*}Q$iB}%Kv?@ literal 0 HcmV?d00001 diff --git a/panther_lights/animations/lynx/triangle01_blue.png b/panther_lights/animations/lynx/triangle01_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..87b8e70131407a84d3c94edaca88c1ab4806297c GIT binary patch literal 6204 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 literal 0 HcmV?d00001 diff --git a/panther_lights/animations/lynx/triangle01_purple.png b/panther_lights/animations/lynx/triangle01_purple.png new file mode 100644 index 0000000000000000000000000000000000000000..9ac0fe0c072a254f7d2d339bdddadfc2cdd59db9 GIT binary patch literal 6752 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 VexYg)lTCz$PqK8hC^p*@`yYwQ=iUGS literal 0 HcmV?d00001 diff --git a/panther_lights/animations/lynx/triangle01_red_v2.png b/panther_lights/animations/lynx/triangle01_red_v2.png deleted file mode 100644 index 034d9927b3c97de007be616fd7633e00b3009105..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8069 zcmeHKc{tSF+n=!|WGRzKOe1?{7c)q9Bm2Il*)TCiV=&gNNkoXsPL?c@ecwu2o5 zYmr1rv=HhY>e=4+_s?@(@9)27=K7xR`QGQgKj*$b=RW5;cbvJY!7d smHa3umZn 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 literal 0 HcmV?d00001 diff --git a/panther_lights/config/lynx_animations.yaml b/panther_lights/config/lynx_animations.yaml index 44f9e2d11..a697e5e38 100644 --- a/panther_lights/config/lynx_animations.yaml +++ b/panther_lights/config/lynx_animations.yaml @@ -14,7 +14,7 @@ segments: - name: fr channel: 2 led_range: 0-10 - - name: fl + - name: rr channel: 2 led_range: 21-11 diff --git a/panther_lights/config/lynx_driver.yaml b/panther_lights/config/lynx_driver.yaml index 1dc9dca72..576c6cbe7 100644 --- a/panther_lights/config/lynx_driver.yaml +++ b/panther_lights/config/lynx_driver.yaml @@ -1,5 +1,3 @@ -/**: - lights_driver: - ros__parameters: - channel_1_num_led: 22 - channel_2_num_led: 22 +# In ComposableNode ros__parameters are not supported: +channel_1_num_led: 22 +channel_2_num_led: 22 diff --git a/panther_lights/config/panther_driver.yaml b/panther_lights/config/panther_driver.yaml index 404dfbabf..10b4b3780 100644 --- a/panther_lights/config/panther_driver.yaml +++ b/panther_lights/config/panther_driver.yaml @@ -1,5 +1,3 @@ -/**: - lights_driver: - ros__parameters: - channel_1_num_led: 46 - channel_2_num_led: 46 +# In ComposableNode ros__parameters are not supported: +channel_1_num_led: 46 +channel_2_num_led: 46 diff --git a/panther_lights/launch/lights.launch.py b/panther_lights/launch/lights.launch.py index 9a97853f1..f77ef14dc 100644 --- a/panther_lights/launch/lights.launch.py +++ b/panther_lights/launch/lights.launch.py @@ -34,13 +34,12 @@ def generate_launch_description(): robot_model = LaunchConfiguration("robot_model") lights_pkg = FindPackageShare("panther_lights") - animations_file = PythonExpression(["'", robot_model, "_animation.yaml'"]) - default_animations_path = PathJoinSubstitution([lights_pkg, "config", animations_file]) + animations_config = PythonExpression(["'", robot_model, "_animations.yaml'"]) animations_config_path = LaunchConfiguration("animations_config_path") declare_animations_config_path_arg = DeclareLaunchArgument( "animations_config_path", - default_value=default_animations_path, + default_value=PathJoinSubstitution([lights_pkg, "config", animations_config]), description="Path to a YAML file with a description of led configuration.", ) @@ -74,8 +73,8 @@ def generate_launch_description(): description="Path to a YAML file with a description of the user defined animations.", ) - driver_file = PythonExpression(["'", robot_model, "_driver.yaml'"]) - driver_path = PathJoinSubstitution([lights_pkg, "config", driver_file]) + driver_config = PythonExpression(["'", robot_model, "_driver.yaml'"]) + driver_config_path = PathJoinSubstitution([lights_pkg, "config", driver_config]) lights_container = ComposableNodeContainer( package="rclcpp_components", name="lights_container", @@ -88,7 +87,7 @@ def generate_launch_description(): name="lights_driver", namespace=namespace, remappings=[("/diagnostics", "diagnostics")], - parameters=[driver_path], + parameters=[driver_config_path], extra_arguments=[ {"use_intra_process_comms": True}, ], From 611f315b2d1e5a65a0242213d763e5d0f71b113e Mon Sep 17 00:00:00 2001 From: rafal-gorecki Date: Mon, 23 Sep 2024 17:57:00 +0200 Subject: [PATCH 04/12] Update README.md --- README.md | 3 +++ panther_bringup/launch/bringup.launch.py | 5 +++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f141f4b5b..2732851c8 100644 --- a/README.md +++ b/README.md @@ -71,6 +71,9 @@ Simulation: ros2 launch panther_gazebo simulation.launch.py ``` +> [!IMPORTANT] +> You can change spawning robot in simulation, by adding `robot_model:={robot_model}` argument. + ### Launch Arguments Launch arguments are largely common to both simulation and physical robot. However, there is a group of arguments that apply only to hardware or only to the simulator. Below is a legend to the tables with all launch arguments. diff --git a/panther_bringup/launch/bringup.launch.py b/panther_bringup/launch/bringup.launch.py index 37886eb7c..c291d92ce 100644 --- a/panther_bringup/launch/bringup.launch.py +++ b/panther_bringup/launch/bringup.launch.py @@ -53,8 +53,9 @@ def generate_launch_description(): choices=["True", "true", "False", "false"], ) - robot_model = os.environ.get("ROBOT_MODEL", default="PTH") - robot_model = "lynx" if robot_model == "LNX" else "panther" + robot_model_dict = {"LNX": "lynx", "PTH": "panther"} + robot_model_env = os.environ.get("ROBOT_MODEL", default="PTH") + robot_model = robot_model_dict[robot_model_env] robot_serial_no = EnvironmentVariable(name="ROBOT_SERIAL_NO", default_value="----") robot_version = EnvironmentVariable(name="ROBOT_VERSION", default_value="1.0") welcome_info = welcome_msg(robot_model, robot_serial_no, robot_version) From 2965cf02c32d785cc8f10fdd72ec99a0c6d563cc Mon Sep 17 00:00:00 2001 From: rafal-gorecki Date: Mon, 23 Sep 2024 18:06:13 +0200 Subject: [PATCH 05/12] Horizontal flip fix --- .../animations/lynx/battery_critical.png | Bin 7009 -> 7229 bytes .../animations/lynx/battery_low.png | Bin 7403 -> 7614 bytes .../animations/lynx/triangle01_blue.png | Bin 6204 -> 6497 bytes .../animations/lynx/triangle01_cyan.png | Bin 7186 -> 7481 bytes .../animations/lynx/triangle01_green.png | Bin 7011 -> 7309 bytes .../animations/lynx/triangle01_orange.png | Bin 7081 -> 7384 bytes .../animations/lynx/triangle01_purple.png | Bin 6752 -> 7063 bytes .../animations/lynx/triangle01_red.png | Bin 6828 -> 7144 bytes .../animations/lynx/triangle01_yellow.png | Bin 7268 -> 7601 bytes 9 files changed, 0 insertions(+), 0 deletions(-) diff --git a/panther_lights/animations/lynx/battery_critical.png b/panther_lights/animations/lynx/battery_critical.png index 6cd7dda869ef44ec6cf601b983c8892aca45607a..e5fc772315dc4e215ea31fa054f496d76b9ee547 100644 GIT binary patch delta 3670 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 WOSD3~*pjoL{W)vxc$#E+IpsgRB-U{N delta 3623 zcmV+?4%qR%IN>&sBmt0-B_DrTlH)iMME`M$IRX$1mg8VGn;XpW=Ye8ocV*X4%}6GZ zB0(VF?%@#%`#=9a;a|KYdJN{J=9Y8hWzCv&PHOzT`tzNlJ>Snu_Ioe=dOeJ5WJ@S?@&cok)M>b0fVI^v||p zZngY<3*+6|`}_w6KH+|iudDtJ{_)!i=q+a*71^2;q*V0{K<~$bc1{}Kq6EdD@?430 ztF|{10QntG-!I06b3?V?4*G=^i@#^<>n!|a%j6xRKS0jk$KPHL$$!tv1O4A4s_&Wn zdVSbust|vme?RA}dY*qhvx{ySsPnt2udO_1j2kR*m#%^Nax8qDDa!M1yeq1nNMXep z2k)6$66iX~(n>v@w4dWllMqdIkiv<`6n!pMEz)G_< zi!(f{RaRb!p^}&^@yH*)!=FBI&P|1s;tRe#{EA$#3F9(%zZrkVopfGM{Q>yv{quEs zRc7*w@=cKju;Vku@bs4x=tHzJ&^dk-naX-6AQ+Z*f=LPku$I(QPO*rTlmN0qP$zT} zNCpffcUc4}rkdfV%3YdAN_vKh3zq}eF*BHO&E#3Vc?Vf$j(&<&G}K+)+&z2o>dkxB zY}s?pC0|qQMT>uh;w6_-YH6ictyaC}T57GW_9jg+O>eoCR$FVmvu0=J&eNR%y$=~W zY4BAfOCw*}j?w`EV-8^nEAt1o)Tv?RaXS}p ztaIfo>*RlFr$>U!!PCelLMf9&9pcuGrzfN*CjsfsV-$P>JJg*^9a2}vetRiAl+2Uw z+D;1no*R`gk6f34>N1vqeluq=1O>ZiOmyMJd7I!3uvYz z0t4LVNmxvCdY`Cm(;4Vk1&Ukp*)p+gvYsU=`7nQ?BP4RgxLl@6J6U6{0NGErGZ!9y ze^5&MY9r4nW3;8|6t=hRuz|L&7-gBEl%0=_o92=$OVtVeX!|r|JFB?@@v*Ya1!b@356061 z-NJt=hI)+7X(nBLpx)IfE2wjib|XRJYZKI}v!cJDGaIZlk_OqFIY$nVv7DT3AjPT$ zobP0yGjJ?4+CA4pU1K26=pK`SuyRW8$H|sqJ}8iBz-n85$kDa7w079u1%4>nNALBC z-gBW0_+Dr$Hm!4c>MsXmpM(r+2>Lv-@u^eMbcY!RqFW zg?u0V%8V~%zp)3ut;!-j3(8x!C2@Rk*zLwL>34^*0mMN5oSJ_fSmEGf8nc}?UPVXh0E-i4(6-NYhdTBdJkcgV zCE6sbWT>-k+BVDp+~&qK%37GlpkdRC{E%MOT-L)b2Sg}J$c4-SXoM9DED>*u7+2%*35J1`q=ixCmA%j2Fr)tx1WbvkX(s@E{6 zN$?k8WKh!U!N_kW@30it1^K_NdVj|6Ro`PVzvgFF6Ijs$m}0IeJuBv&!X=2mVw(o` zT;^dWp+>54Yd5FBE{-|)Poe%`iw~3i`WMijV~|ISqQh~bA&rB-x z7`N)pJKK3IbX|4Y6{lnHJ**9ax0iahP`Z`rU;6((ZqtepESd(VUy1yYU@pXm`Cjk@ z&wdJ_;H?NZ(?sJ)Ue2w}2C-z!XFq+?L;T!Myka5xmG=oPk}xdWI=xG4#Wt-*!$H}C zf1YUVAJBhOaOhuJ_%8@wQU#J|SfC%1vj-u6#Sf|u78G&FP@OD_iU=-Rg(6f4wL+^7 zCYOFelZGV4#ZhoAIQX$xb#QUk)xlK|1V2EW9h?+hq{ROvg%+_M9QWhhy~o`ihgbf6F2n8B#bEMrcRVrV+P?&0I>U6^MzKlkV8QqvX#d?N9G zEHg}-c!PLq(>6Ho69-vNR*BDvM@+gP@gvt2kKZ_FT^4v|&`iYViG##qwtM%Iw=<7v>$2W zA8`E=xfF8c!N{?IA~eXZAN&t~cWY&TCdR#_Km=%gah#7KpluhZmL2E&*m0^Sfd3h| z((C?W1(^OMyw3Uu3|U9!67i5rR?=4?{07G?cX!C{(b=O^K#jbFpew$01X;xR9JLaO-wqoQ3-+q zBsVrF z0Z)K8z+2!Q@Cw)iI$*Z;{9E7#_yc?f-UAHcQJS0~xppC{Ot z!1Hth_biQ{C)>Y(AL#@Z33|x-b~1dBnwVP;mDOufmRtWomn&k6@!<~EZTvJz-wj} ztw6hqK8lup?LfugrAxndpw-5`0<8k~3{(v69cYzt&p@ldJp)yLG42s)HMm!xRp6e1 zRvY&Uv>MziP&MP$fvSLe1X>O56{w1Fk3dzxJpxrVZW*W=xOJc^;2wdh886-4str^f zJa>1iHc&Ni>F$;^P<7)aGfPdNs^HR@MG~kQxMXIj2~^d1>C#^ls4BR0>6ZlB#JEME z>fly^s)Abvs&3qWDo}NBt3aC>Zyjh8aEn0I!L0&qV%#FoCg2uim zE6{x}eXl-|;kFdR1s2e%}kcX5V}dczzUK6OhacQ9L;Lw#X60sO8& zLxZmede&P-!y8`@^lB{NcLh2c8nAy(bv2uww1a{tRKhLwn!b0$4!KB1D3-}3bJ>g?#;t(IR0eM6vf9)kb%YXK`!n0aqWls#viOCYT{PjEh z?G5K#Dx?(O$uAGSIp1Wnjf>p(zNVO({-Xr) z04)quj<1SL=I;sE3`;AUNdf|(mPAuc(U7Nsaic&vT8Z|Ujw5V!T)23ZVm0GISTCHAD941zRsZ}#; z)@?LtrD?0pT5G+Hp1UBL+H1GodhcVf=3wT*-Gc#R%sge5sbSV>v&}xoqI_0ay6Upk zR$s%ji=!W2-Mo4CvD2oMcG1TYQmfp1e`Th&k(i^q> zAaw`Y7iyd}`%ICpoan_2z;KZS;&vgRp!3Bnwp2>K$X(2!H>}XiCiPml&VTgCYe+tcJG~YevWOoZoTP1R8>fz=t0aQU zcT=)PU#_#;Oh>I3m90Z9%^=J~ao#&pJ*g{E%|QvUwL4LEs!5VkOiM;nIcpFjJP?a) zeOyo2kakoGkKCu#+S(Kt<&mrS4MvYPTeE2%ZPBf4a6p@8PE-r@@d|bnX-P~#^|FMZ9~Nx5CJ0vEJ;A_aq; zqw4XDK#Lv>n8F&Q&S3veaD;?iM1PI?9+1A21IcEs4(ASxE$!4oc$9qYGi9oLlcKcm zu12vP^um8A&<;3_Fx<9H&ANbOo!ML7ltQuIVG+A8b1wp(fXEO~ZDG-)DAcdMecmCb3MKZiR1$Zhr#FsT4hWG^nJ7 zJhGvRW-sE}On(ST1Ho?03jwDuW=Tq2kfOa3CzlSZ z6bvD-1QwFUmA_pKD|9WG2b>NstAe%kzF!gSW_~-|h|eJCjde>r0IC{!tikQmj-4^Vbjbgig&}Xj#J#sJp{;AY8^M#tO>Y54I>_z_L^8JQ#wdjl34~v;15Er#glUUIy)b&GoPu`j)eKmRJG5_egPGRP;&^oooI^&`Kxu=f0rLqMw3dG&DP! z;mFwo&oEnj&VTD~q+r!Z>eo3>U$za=#bYSXMG72!z#?ye7_3~6BwVV%=#S=rA2Jv~%D2a2;S%M<}zwo#qQ8 zzyWMBXhVI-xhDOK$&1QxC_$0(CU*QB%~QgbN2dAMw110i;N#SGZGSD~i?FZD&3qc& zjh5hddcIDN;Q!|bH)RMy;;~Omh%ZchA%p{r#s5n60lpv z!XR2i2Y9%8$Wb!>=zElo>P4ZOO7PNdwn9(V5mp;lt5 z*)|HOnq{QoF)@=}5d*L2L@z>^M!&>NeKwg)z;k@v!^hXVD9`df_vh$VawY?OBJm8< z4U2f4cyiOyIqwsPSy57m&xuD2x*+i**JYRAI2RlicxKp0r{;*m#A2a^Lere+&VEU7%jI?eAmTuAcz@XW&X} z`pY$7>XY5#ex~a)~z~v6m_dujehU7?onnFGgyr0oGWr3bsplj9bt+9{O z2Ov#dC2oL&LtwZ-*=ru}?r81p-!qN=egL^Qa>MWuagG204gIrX3W@?GIbmUCFgapl zEi*V_Gc7bQF*hw@IXN>eVP-HfH840dFf%kTlMoH63O6!1H8eLgG&4D~#0^{llRXYx zBr`TOH!wLjVJ$K?F)}SQFlJ#bVPj=wEnzigIAmoxWHvW8W0SoOP6s$TFflqZHM0^A zZU_WKmFN|dgcmb^5CIvNO9bfv00kFGL_t(|+U=c9ZyHw=hM&320JcM%L~7Kk*)-kt zPju6tomE#|b(Lint=cF}`eE0U7{h#YabXByKJL8(%sJA`#l6i^hf&S3rk zAJ?$TAkF;l-8u2g1fE>ja{2l(TqX7uXi7URV6ld`ckss?Ztv|AI4gKOf@y4lXOmsx zb>sy$@l^(Yw@dhU35%8eeV&~O{K7zNU}P+CY^sI)6na}KSq={=JY@D2@V(5j#GJ(T z32f7D6En?ioo@y85wjC`m6&5sF&Asw7JbF+oOoYib_VZD%ue8airGE!p2Q3W?_11H ziT5dHC-6SS3{il$vw;VR`Pmsf%We9;XYkI6`-*w& zjuH$WBIYqWN)WiOn5XC{;fZ^QdF)Xi1m0E5V~qOX#3hIs1TH~LZ*VDMh9xdQOfPUr zVtOYoMNDsSDPnqoOA^yRaUo(lgG&?BD{)C;dVxz4(-~Zvn0|>164MD>qL|K!OB2%> zT$-4FPT&&7bWhw@%p-5Dyum}oJoeTqC~wRx|p@#(#5O<*C1wn;=;u|0M{aaW@X|U#H<9@Am#zM7BQ<6S0Lsdc(9mf z*jlwF9wO#BwpOj+-eR6 zpO_Xr(kCW>8OQp>v?E`km;mPKrTregCNb^gjBPvABxc!Fk`W||!~`&t*tSEXNK63p z?81sUQ6wgSd2tOduHka*AZAZntJ<^5Y+`G?P0YTwR<#2tF`o<{KM8QjsR6Gq^M{TfwD@>72MUG26j~is@7;62)`^ zmndcg+-ccHVYg}?i zX#|(tQ7XZukNVccrH=Y~a0O!4mWp&SYr&<9c>u0O%-Y1Ii+KpHM9j)k(I93exCSxz zz%_|knYacq_rVp3c~B}^#5@4kB4!D$P0WMDwTQU`S0?6Osb~@tz!VC_+^=!LTdT$z zm%O!VtZ~U(tLhq8*ilM3wRIGKTPlUVjd>JSsa+%4h5!a~oLhzVfc z&Ed}l+$>?a)=}R8@lU_Oo4;)zzg_A`8zBDqExcdY;iDyOfav8F#eXY63#}z>fM_`hT9_a~Pb--zKv4-k87M z==Gi7eoXW(R6L^0$$ls5??fekZlrgD@!3{v-SqEUnD5r!=RaxSFZjp&x+?GBAK$Bz zy)CR$ay}&$GF3`>11SDiLm8ZOK64=`2I+Gp@tI0~BOxKb%hUI(6Vdfh>u(4Bf=Z3Q zN9*e>{6wqfcYjFvk>vJ${O$FSEm*=7t%{{LNx9ab7vx4d_2CnOYy_WnPOL~^=aeswpHDl$S7@8B40sEi7!=FBI zuS+4N_$I$T_~z`%CJaZ;KN-fIbl;@Pli;uS&zIv`m`Oa#E|E@R=Vyv3=`SZJ5732y z!tuk%r2CzKU|3oRCKV6>wNxav6g6i}i9{Lz4MImid4fO^$(tZ^Ev12tWnY>{G(AJJ zWG)A;V}E8KA*G=+bKL<}tpb0v8XOu@q>4xr6_YNbl~$Xy*0i}P4lP=PiZ)d>?K-Sj zHL+%DX5B{5yxFdS(0b{RgO}7q$E#~d%hrM82qBv6P^>(0Ica}AWu8ZhaSZc)2w_Vbn zb4g zJXSBY#r#{0XUvtR=9}6`$)xNv_dxhzqJQ3Uww&1E|8%%;?`2m8OK)dF-o4hPqf5GL z%u{dKLmP-y-B4tgxq(0BI;XAL+aVLwdA3G<@GfAH?Pnxacd^C6xY3iGs;7|7NMhH5 zl1vq(X=n72u};}*u6_Dtr?W47stPGUNo&OCOO2^bavhgK#hR7^1WZVsZe;BttAEzM z$W0~#BbV8P{a(^nPHfZmZ8_E1sFFTn-PTzzcWq_Q1tn#KQLF>T>2h?RawojEsie`C z$`T!MlUsTa?(|8noY?T-9=U>?Qc6u{54KGUG^1!$l#$HfS{-Bz*kmESgCz)y3`I=k z1J4gR&ku!D>)vk*I)kbV@^;rP*aaie@cC zy?BjOq*f*y#RYl*#tt~ZJa7`U0>E=&Fb)QRm$>i=5;YDMSy=I4IC(92o3X_FVeJV$ z9n8I))bJT24K(7AG8wclu79Zo_5=ns@CyJGblL6$wq{n{)5fhD(njEMmdqm^bImAN z9ZHzkp*?D9`$GRBX0kd&CzU5@Tb=(MfBN-LdVlu_kkv?>TM}z8sk5jTqVK@{55=4-l z(9c<CpHW~Q2A$w;cB5|}uNQ-5a5-~7it;g&r zofAo-qO`}g-N);t<$pZ<#2d|+pobjY`LU3CU}Hu5ng#K9w--rY_Cj5dRuiTFkbj`- zcInKiB~myrD@Wa>UqMMlz*ZfPj3x;V;tO#e;@N*n!F03rLPn;B7aq-VIDtM%;IF2zTsUckzfqDheF>!G3;*mqfZc0Ii zaV)wY3~orSZF}31Hrt>0<&E(R$$>OmOkAI>?Zhp~GgWWE7xVa9Lur zzhZN%{mNk;ZGQ?sMHF$AO(jK@3Dpl^>-d9!fo$-G&x)5rFr`_E>7cAYB|!iSL9|A} zp+n(!cM`YQ70C#`NAfTu^)l39GXa;r`z^TiIQ^^OeivSL zM9n`E_T|^x@wt&j#_uxLN299+6;TAy$)&-;_Gl-(`0neS6W8mo8F$Yvx^+T>(|2#E zbPx~39_~9|Ij9Z&*pDbM+jUUHGw<98ZgvSe=~^bN^s4TaNe2@}QbP*RikCz;?{>er zO@$fV4S$E~d|nMnpxOBg|F7euJzj1g8?q2Un=ZQU7DboFXKpwqt>W_lNrKrwrg)Du zrT*WA{{nb7ikZd`dmaD)0fT8nLr_UWLm+T+Z)Rz1WdHzpoPCiyNCQC>MUPSOL&U;> zA{JYym4c{juEGGfreGs6`hRwT2g(Xs4AL&`mcz9u9}7x<2nz z9o+V-tm<`tu9n!UYeJ1CJZ7eyjPQ!^$VMiucuzQBuIVx1GvPi*8Wes|x>4j;#fbv@ zRDWi`nTt#a2ZXgm1sfG?t~r+QuyA+GvL)XaEpklpreZ6ZHA{V}7y4K2`B|mQ?qZ5* zW(cEUkY$}D8T#e4MRAG9eXxqZv)~Vl%MjN(rZ^@^VWAiNs6Y5UTQ@#5SWNNW0G&Ga`45|t< zHa9XbHZnFaFtf4^TmiH34`2uc_JcfclT{cqe-8l+?d$|k000FQNklf&q z5QbkaKP1_fod*3xb0~@)`x|=7&+esvqPL>xAxP>1jce7GEQw+dOT}thk=)tYnIS-4 zC<8R`@Z~-;>j4dA02&N9J}-e!FM;pB0Dkxec>Nvl>Kd3AfOA0h(e(|0Lj!Dfz}pq@ zf8#H}Prm{`-vaMe!0irEhZ}m~`ryy?0oWh>`Ouud>*I}N8Q?OY%7Ix96d70!7jp5w z2DUZuxC2&Cz^(?G=KM3uTJSOlUd(};IdEC|n^@+8;Ey}tZtWlSn|t742kd)NFEZe= z1iroozFYz?7QjU*nE0wq`(X?GwE^xnfBxsD1030N;>(%8fq4NGx$sf}e8NvP@U-{q z{J2!QQg<0pIDZ4V^Pd+^5PW?i=C1aidj)M%&mAx;_yi44yaqOVzrI5Rt(XN32Dc(; z5V$2lNs3qyH27Do2ue%bfS@FB3xWoNTM?A3$5GI2-LCQGc{?j1C>^|&^0>Y2f1*wy zC<*+yH*Z?-zP))0LFtJTDhsEeWbn|+!YwEXoK#tu1&!JjhqQifLCN5ut)E-axWp9& zjRMyclnkydXyl))dV)rQYYG~lxRRjJ;97!4folpHow$~u(coHw@+7VxC=0lTpwZx3 zg0dv8At(#DhM;_j3k%8yE-fevf4GLAY>9_Xw_*k51rL~R#R|#>PMvO11?5dVu(HGm z$_gG_St0~w1E*A$7(rPR4{iN1g0g~BTR%lm{=|g@We1lMloec3Q1-;71Z4-85;RTX z0)i$1mk^X4TuRU+iAxBY1YAPUbcrVxG#PkmL6d+>2%0SM)Pg1hPc3NLf5a0CniM>x zpvk~f3z{_X(CJo)py|O0)2$(bCIzQVw}uLuKJn1XGEmUu;FPyQhX|S!JZ5g*Cus7- zsja_H(B$Bh);~m0nZy$aDgw?e=rR`oPa&vS;wc0b0p}KU;Up7h6jXGna0@B|&MoLw zC73v;pz~4?oK;XKoj8}Ef0-~im!MT42+k?!Qd&+9LBCo8pIiuovj|!Ni$Wvu2tmtM zQ1Pk~E2wk69L}T@j}>&*3i@&Z6i_(2rdwHupcfVJ>IV4zZ-u2onQna$)OkU#G|C}q zx`pQ^R65}X6jNEUlXLEr$|0q)oR-9S0ep6;08Xwf?MCZ*27LQcf2pc;w*KsVWpNIu z;NexkNv;0`zRZ-?IJNbku5~qVilC>53OH3zb#Ut5+yppPP#cL81yu)+5mXI4R#4T% zV+2(Nj}cTqaiXB=;8a0X!D9qfPn;^KIyhBO8;KJHH33c$R2`fusENe;rdzhb1E*Ui zz$w!$JBbHY7Bk?Xf0e}qIHj_fNj$Xmn*k4P{k9Sh5Y!ZSh@fV`Lj^UJc!;2;z(WMJ zm-s+I&4CXU)D(D#pym=EDyTW|p@P~>e1M=P!G{QH4t%JfCKDebs7df4g4#{IM^Lli zeS(?1h(JlFco z%Xv=F`Y;0U{}t3a_{W02Uq5$I^NIgU(35p;9{fLojwVBLKc*u62>0Hz?Q79kMN~yD^jXwvDOV46{bcd_N^x7( z1lBfm&h5Bcjy%ArnFlJZqwiFJ{iaHjf;O$I9W)SPEq|*R+EPXW-e<4@BroG4K|MF^ zV&KRGH42Z5LzT-r7P{Q}v{*?cBIir`uh3^5SM zN-U&^$bU*PA|$c_pg`!T#?pZRiIj;TOJ!DogX(~9d}DN(7Af~IRF!LDVPyk0sA7Os ztAIaN8#olgQbk0?q=`!?>#00d(<9GeY}Lfn%vv(HXxwU(rp;Pw-olGBdoCF z;50CE;Ol@vL@%9t?b5YdZ{1Um0s4$OWazNbhJTNkW%5LUPn|Z~^cjm5sI=;mrOQ@Z zzG8!Fn|Ix^bz9nP`;Iqi^px$-_aC4}4{GH?>KNJ^HH@0Qrl2Dyaxep8r4j%)pa#T1 z?1NcuRBJiN9n7#Fp(>;xNIBq4I*0+mx~RyeH+Bzl30eF{a7)%M+{*upTsqKw6S-e; z`+ps3^XwAiLhLTXlhn+pKD=Ko%;ASitV_ET{LWEYoTI{NT6%T9(e_!OW(J&u+(=@q zmXD-%3?x?`wl@~MCUcDFP%}ipzI=@ED(u)8CTm};00GKgJ!=vU$wd% zP}H^y!`&2~ShthxURTjpwO1PAD_NDGY0l zuQsdB!oB#wLj#5-wLmgi?#w~<{-$LR=ydlSb#qomxFvkdbVPnr^eu#wOer1MkDj4O zhxrU%#u&p@F3e`_w6gD^(U0oKhB0-JH35KL$HMYrHJw)qN0B?3sIxCx>itThEq`oC zj^av(=`Fy#fjT%4Hr{PwdhB;&!ZD6kfRqErs%fJuHYt<|xWvsnAO+{E9v(T(+912r zmUU6k+`xQ}$%yz05WCk`)SC0kT?exP$N0$TmAo(zd1gfzo`oBhu8y^D*Rm`GMU9LB z_trA1W5Vx}1Y|F6+Q_J3SLMH8^sw&E^6t%- z{*vGZDNzsJs8$yZKg2^34_$Pg4Uwh-7o%Gpc7lvUgaQ??8lfW&EGq6RtJGqhCN}(o z%jI`foC6UvR63iMaW;Tn?0N$Q;DC~K3$JmYHf)XZ*utX+Da z%W!T+dF~*bYQsAIubEu>qIg8kASdZ1b05_D%&f0kpkMRAIxF~8MX~ooycF;ZX&^Hy zuMBGi;Y!595e|8S^*AEkXMe!>pnnMtNrT(HmC!J3B~OJ;gUxm#P4;`!w_RR1dHM5}Z{z64 z0*1B~lC)4so-o-zGFQT6|HxeF4(ywA;rs*9&gs8B$43HmDYF>>00D++LqkwWLqi~N za&Km7Y-Iodc$|HaJxIeq9K~N#r7D#U7W}{=Lv^wsDk4r=g?}PcD78YX4knj=2u&K2 z6c+H=vHzj1AHR!4ATvZc%681 z)6zNb6Ngz*Qh$igiAM~&An_yDWtZPL7aSINX4pul=7__@VxfiQ7G_05C7vLTD5^&J zLdIo<^A=~dRAG&K@)rhk+VT?DX$~Te1uP;75i%;+KnWJ2v}&Z7NYQ@G!$08oljM@g zwE;$sd6c0-a{Sh zG%#akEjTbYV=XW=V=^;1Vq!KnW;l}x3#tk?GB`0cH8?UkHM6}7Tmh3d3|u5)W@R@q zGB;%{HaRmiEi^JXHZ5UeH8(A0HZnFjWic}_IW#eowhT@OI65#fIx;b{3k_}v1j@h0 zw3B@mGY1d>6`uV_!jrcZD1U27L_t(|+U=anOB+!XhrdZqDQX{75bUBN*mluvxBbhz z>>r{#K~Y@ zbX`Q|tM>-r&qZYZdYAepHkCk{HM6G#(!8lHC1?q5M+u}|b2~~P?Ju#R1k&xY{7TRR zJg*W+_e<-PAZ|oTzsvJQWB~9y5h?v|ktZT0%x%&~q=f5(w0{v97(87>O4uQjZq_8> z$9tMtQzY>Cv!)2(X=Y84z~j%FB7(7=Y{Sdge4!)Z2yTE5)OaXHzFL(T1 zdI&iJU%;1Nz!^A{KVF`D1YZuz0ek=-zz6UFd;m|nh|?Enky2V*f?RET zXBAlj5(uQ_FrJegWcj(Wsp_sC-jEl&yTBN0x>pim{qy$@f8k<|C1j~utdxi=TQ+W( zXuPj}{Zh==?{)Dy@91?s$T%+;O9^ATAC1rY!aC-3p6w{1$AA8ZpvQz7X7cu;wX@z| z*ZUF3`ccraAknQk&hx<$l=xVb@8@wWDyH?twRv2_#(PQM{&T8aq)^TH%^YhjhPiUg z74e*I=pJl$jP8Iw7aq@#tqhxZB}xc$O6gdc{6D9L(eTSD1#F~LuO-57N_GW40!o+w zOYJCX@fpnbv444s(KpwxxD}yfJ00>n)Slx9-e~-qH_zFj!4owt=S6yjHJ0c2fslQ##8glI#^%dha$X(d+(|HavEN=To8+LoO-x&&9JX~6tAxe?uuLkYZVi} z4Y$S?2RJq3fX>FdROb%PzZyt=o2cqDCieKivi!I$fOQ%z3K*LZ}_0jjO7Vgy!BQ4fXDRzb`5w!&>DIG)%!MrG2&=_?1JOn zXd|O>*B!L@KQ z;6}{}3D^X1uoXZiI1u1(xqrHq$~u;TLtoav=NQyWXG0HyP34Z0vw4`a)?xwIk^!ID z04`x_-W1W3VL2?Aa35;iYbr&U7j= zvO02K70dxD;>^kDiDe4G{A3Kj z^FcxL?yI?zI8y@3wC1vnOn^ljcG)Vto5y8{H?7)18sx|To8k5Oj2^pYp9!=;vs!P$ zgFd%i!edVaGNq@?hYbZyzN3`tH=4t5tNyGxr9F_es};P1A~fiU0s<0LloFgOz{8Gn z3px%O?O0#!d~S%Ij$>n_N(g+BXpSpmZS7g^yp?9XL|r<0IX(Qf<* z6aEDsx;71A9h{Z`00Dz(LqkwWLqi~Na&Km7Y-Iodc$|HaJ4gdT6h)6w@k7MIfFc%K zsFi}Kh^0nBga{!j#82Vw#zY~z3A+h4mV#}-!cSw=!p2%#3x8Wd5d45xTUaUDh^%jt zK!O+thB@4M_wwcq`0`29a_a`bvNKL(DyT&l7PW>KnrNq$8qiHQJsu8+sJcGyR2|&* ztE}pEf3B9;s%t`xCOl@Qos95`@W@6ct$0s3V6N#g;WObrM;a7oj_=mn`(wl5xs zw^RA11!%j0=B47?O81=H!<@`2bPf9l(3_C#B@>Vq`dCEi`5~G%aFcV=*l;HaKQAWnyJBFf(S8C=03zGd4Ln zG&wjlFfp^-3tR!S8xCLy1o>}S1CxIiGY1a=CqYpC50kkTD1S&vL_t(|+U?xQN&`U@ zh2g(C5z!<#;4ID~PKb~1(pM2&xz~-h3#+x!Hdc4na4%FXvj`uTlY6=#i2+I!o&u#O z!{eR_Lv3J~1IC)*6JP;Y2G+H}EA%FC032$7SMgZ0=v&}M!-sPYSgB3>2-uMhp8$)% z4sZ@!182a7b{ zqp1-|4F9jv3yE;IN*8v^cdv9o@OG6hY~t>fE(G4b(gnb~Rk{Fpw@Ob8?_TK%;V!Gs zbbj|DY_9#RzQ_~zxB4Q%{ja_V@Gz?{0zAy>3k(mp`U1lH-DVQO``=~~!TaB462Sf3 zW+KD=-G62x!oyd3z=?;g^Z@WUmF^iHuhKok<5jvxc-%_&1dm_o9^h#z-2*&LrT2uV ztMnf5w3Xfwp1#t1OgwF+cYw>N^pAzHq~Z{Vf;2J89dfq}R3 zGa3d>$3U5X2bAF%p5Ymu;ThiI>9Euaf7c3s)e3*o3cuG1e^3cGa8W9q__NlD=YK+o adOiRGh(94b?B4VM0000GZw1ld(IN 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 Av;Y7A delta 3772 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 KMNUMnLSTY2n*p8x delta 3565 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 FV1lfrXnp_y diff --git a/panther_lights/animations/lynx/triangle01_red.png b/panther_lights/animations/lynx/triangle01_red.png index f373e2070a59014e5b3f29e2fe701130ac785aa0..7cfd0ce849b28dcef13cc745fad53aa824895077 100644 GIT binary patch delta 3326 zcmV*SAl(!<_E z;ojlid)mI7#*3B;u_(7wPgkxh*7Xy`>#f39eQ{*1adEztuleQ&IW_%&X`SmDBG~Vc z!VE3!u&!~0fr%-usEjcV7v-8XK&o+ENs!Jr?5O0(BsHRpD~ErQ#Fs7MI<{WNjbMH{ zKLbl+V6(t0fBEZvx^VBqr4YP5;$#=T@vsvsd;tD4una`PzJr>t06)K9KL=LSqK|sKlAUPB)(ik-a0%-u$Fda6=4gw+P zI59FNkpeidgR_5mN5i!==J=RKRV6veQbfT976VpFnf%dY@cIm0-Ub=Sc z)%7+=pOHo$W$3U`N1JiVgy6GGoi^)iD=boJrIlA%x@>>d)i$ZNWv88Y+3L3Ky4wr2 zaMSkd_kTbw+^EG1sk2aDs4=Vh+#(z~$pA}h}?JFeuvsTRbpI-J!p7>>IL@k zd||*!=52p9)Lx-tu$F2oc`R!B8Y4Pu(OLn9kn*XfKO6%VuWYfkI^r&2xw<-W#4{39 zOIsKo=MXILns#d3?=q#}%QW47_o=m8XM&ZD}uIl+<=Y@$hQCAOv1UG8`! zz3$MX5y~$9SRZSRmsR=H`Pb;aPF$n1BT14grgg??X<0TdEJsM%DK_KRG|MVaJd2~#%-I7VJb&Quwy_$+^G z=0!PZJp-@~kF3?=^d#Rra%)XH5_qg2k9I;oBADybMfCa$T<<8k2TY#}LL2=sO*pB9 zUcGeNE1c+^Y#>Dr)kvOnv^EsHif+@_wCOvZ1yNATM^5%yhh$naScCE`cpI5VdHO}L z%Zpu(n{>FXxkn0aNy87Ql{gdi@brItGvw(Nj(wAca$y7cqY}}_y!);pIRjkRM(>5R zo#O{$*cK6Ke(kk0;u2~@7)DqAIZ+GKJJk*E+K_p?f;$oN$DQ*EWb}$q2;DCfkeT{2 zABW8;WV1FTgKjS$#m?l>kqr%*UNatUm3f&>lGyjG`;v6;qdON86HKCQ+F*Z1v5mc< zP60LRCBgoB2(vo!4jah75mqa`TSeX%MQ##M2c=j^o!#Uu5Vd@S{pfm75YDQ7&;t|K zhpKCBakimw3O!M{mF5w4x>`0d`K9cCK;=6q&ygZX)g{>E4z7{^MTmBNBqL0vU06&t z+W(^vD7uj|b&Z%7vId)mRZ@Sbla3u>BfknMq`uGEw-qXQ=l@Mwk6o35jH8+QK~9{e zfihdi%5#l&^spRkfZVHVIUYN3W2f&5_a7wjZH!V+pB?KG%$q0xIJJdVQEE0+N7@?9 zq%NO|6O+v&8N|Mqmb1{RP=^cUm8^5*&gr$tscdwGEI>)D>^278Q`dj>uKXzJ8 z`tC$A0VaU*Igvg!JgEw%PFl4#mWxnjgX!FneySKckPCVHNF^9K!;e}W_c0--jX{)A zLkzt$PJRTQ`~8E~p-z8`XvT?XKH_M&xS)MFsE(mDDYEFb?#1p8tCJE)dc(APE$rV; zZ}Rc{;~;83LiD-y&v*WK>b`9Jm-lu5&E%i%?B2Jgn(@}@^j3^M!&>NeKwg)z;k@v!^hXVD9`df_vh$VawY?OBJm8<4U2f4cyiOyIqwsP zSy57m&xuD2x*+i**JYRAI2RlicxKp0r{;*m#A2a^Lere+&VEU7%jI?eAmTuAcz@XW&X}`pY$7>XY5#ex~a)~z~v6m_oPdPMWuagG204&bx$35o(FGBRd2W;8c4Eo3-kWi2!~Gh!`a zIWuN0HDP9BVPZ02W@ck$lb{Tz4L30`H!?OjFflVWIXJUa4L<^tunt@#H)b$oGc_|| zEj2eZI4v|VF*Getsc8dLZ#e~*JzyOe1Gk<={4=l*>;RrdU%mmSz*%jlhmn`>z_xBofr%4% z`3T$rfAsYMxPS5hzOPT9N8qWpTEAIk3n&zRs=)UOZ#gou3VZ+#fd9Y^@LOZ^&oI2K z=$lPo5BLOJDy-$aOQFyGHDDL`s=yOnt>#_o!m^=}nbv^sb+r~5sooU2vDuJ!YyJKP zd<3k{;)vJbtGs{F(f+I8mMT)31btoQYkv$}8>~o~x3kLohT)2A1Ya>; zk<#=*1>aPWx$`dXeYmJ1bLM>^_`Hg=kat;hfK?@sWe&2a1hVXb)|8+XxFsc!HV0c$ z0%?1K6(x`^Cs|N}&fvL~K)RloTM4Ak$vKsvH+U{3kiHklr34bmLR~1e5(EWL zsRR--cYi6BKtkW`sgyt>G*uEMhz1^838H{6qXc~`G8%a7ii{2(t0JR<$E?Wc;IS$) z33!Z(ObQ;dB9noKo;4)}4>@bf0v=-4lpH+NtSJk4h*?uM@V-ir9lWa&WCib|1lhs6 zDuD^`E=phuyp0l=0dK1Wroh`Mfl2UXl)xPLdw)vsq=pdPDR^<@)W_w@>xeVVfYL56jZ$e`9~g0r00000NkvXX It^-0~f=+5h#sB~S delta 3152 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 R^UeSO002ovPDHLkV1ku0m(c(K delta 3869 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 Date: Tue, 24 Sep 2024 16:14:11 +0200 Subject: [PATCH 06/12] Reaname all the pkgs and most of the files --- .docs/panther_ros2_api.drawio.svg | 4 - .docs/ros2_system_design.drawio.svg | 4 + .github/workflows/release-project.yaml | 2 +- .github/workflows/run-unit-tests.yaml | 12 +- .pre-commit-config.yaml | 2 +- README.md | 38 ++--- ROS_API.md | 34 ++-- {panther => husarion_ugv}/CHANGELOG.rst | 0 {panther => husarion_ugv}/CMakeLists.txt | 2 +- husarion_ugv/README.md | 3 + .../hardware_deps.repos | 0 {panther => husarion_ugv}/package.xml | 8 +- .../simulation_deps.repos | 0 .../CHANGELOG.rst | 0 .../CMakeLists.txt | 6 +- .../README.md | 18 +- .../husarion_ugv_battery}/adc_data_reader.hpp | 10 +- .../battery/adc_battery.hpp | 22 +-- .../husarion_ugv_battery}/battery/battery.hpp | 10 +- .../battery/roboteq_battery.hpp | 18 +- .../battery_driver_node.hpp | 16 +- .../battery_publisher/battery_publisher.hpp | 10 +- .../dual_battery_publisher.hpp | 14 +- .../single_battery_publisher.hpp | 14 +- .../launch/battery.launch.py | 2 +- .../package.xml | 4 +- .../src/battery/adc_battery.cpp | 16 +- .../src/battery/roboteq_battery.cpp | 12 +- .../src/battery_driver_node.cpp | 20 +-- .../battery_publisher/battery_publisher.cpp | 6 +- .../dual_battery_publisher.cpp | 16 +- .../single_battery_publisher.cpp | 10 +- .../src/main.cpp | 5 +- .../test/battery/test_adc_battery.cpp | 20 ++- .../test/battery/test_battery.cpp | 11 +- .../test/battery/test_roboteq_battery.cpp | 18 +- .../test_battery_publisher.cpp | 6 +- .../test_dual_battery_publisher.cpp | 32 ++-- .../test_single_battery_publisher.cpp | 24 +-- .../test/test_adc_data_reader.cpp | 6 +- .../test_battery_driver_node_adc_dual.cpp | 18 +- .../test_battery_driver_node_adc_single.cpp | 16 +- .../test/test_battery_driver_node_roboteq.cpp | 12 +- .../test/utils/test_battery_driver_node.hpp | 12 +- .../CHANGELOG.rst | 0 .../CMakeLists.txt | 2 +- .../README.md | 4 +- .../launch/bringup.launch.py | 14 +- .../package.xml | 18 +- .../CHANGELOG.rst | 0 .../CMakeLists.txt | 2 +- husarion_ugv_controller/CONFIGURATION.md | 9 + .../README.md | 4 +- .../config/WH01_controller.yaml | 0 .../config/WH02_controller.yaml | 0 .../config/WH04_controller.yaml | 2 +- .../config/WH05_controller.yaml | 0 .../launch/controller.launch.py | 8 +- .../package.xml | 6 +- .../CHANGELOG.rst | 0 .../CMakeLists.txt | 4 +- .../README.md | 4 +- .../cmake/SuperBuild.cmake | 2 +- .../config/system_monitor.yaml | 0 .../husarion_ugv_diagnostics}/filesystem.hpp | 10 +- .../system_monitor_node.hpp | 14 +- .../husarion_ugv_diagnostics}/types.hpp | 10 +- .../launch/system_monitor.launch.py | 2 +- .../package.xml | 6 +- .../src/main.cpp | 8 +- .../src/system_monitor_node.cpp | 24 +-- .../integration/system_monitor_node.test.py | 2 +- .../test/unit/test_filesystem.cpp | 7 +- .../test/unit/test_system_monitor_node.cpp | 26 +-- .../CHANGELOG.rst | 0 .../CMakeLists.txt | 15 +- .../CONFIGURATION.md | 12 +- .../README.md | 4 +- .../config/battery_plugin.yaml | 4 +- .../config/gz_bridge.yaml | 0 .../config/teleop_with_estop.config | 0 .../hooks/husarion_ugv_gazebo.sh.in | 0 .../husarion_ugv_gazebo/estop_system.hpp | 12 +- .../husarion_ugv_gazebo}/gui/e_stop.hpp | 10 +- .../husarion_ugv_gazebo}/led_strip.hpp | 10 +- .../launch/simulate_robot.launch.py | 20 +-- .../launch/simulation.launch.py | 4 +- .../launch/spawn_robot.launch.py | 2 +- .../package.xml | 12 +- .../plugins.xml | 6 +- .../src/estop_system.cpp | 30 ++-- .../src/gui/EStop.qml | 0 .../src/gui/EStop.qrc | 0 .../src/gui/e_stop.cpp | 8 +- .../src/led_strip.cpp | 10 +- .../CHANGELOG.rst | 0 .../CMakeLists.txt | 40 ++--- .../CODE_STRUCTURE.md | 0 .../README.md | 6 +- .../cmake/SuperBuild.cmake | 2 +- .../config/canopen_configuration.yaml | 0 .../config/master.dcf | 0 .../config/phidgets_spatial_parameters.yaml | 0 .../roboteq_motor_controllers_v80_21a.eds | 0 .../husarion_ugv_hardware_interfaces.xml | 14 +- .../panther_imu_sensor/panther_imu_sensor.hpp | 10 +- .../panther_system/gpio/gpio_controller.hpp | 18 +- .../panther_system/gpio/gpio_driver.hpp | 12 +- .../panther_system/gpio/types.hpp | 10 +- .../panther_system/lynx_system.hpp | 12 +- .../panther_system/panther_system.hpp | 12 +- .../robot_driver/canopen_manager.hpp | 10 +- .../panther_system/robot_driver/driver.hpp | 10 +- .../robot_driver/lynx_robot_driver.hpp | 16 +- .../robot_driver/panther_robot_driver.hpp | 16 +- .../robot_driver/robot_driver.hpp | 12 +- .../robot_driver/roboteq_data_converters.hpp | 14 +- .../robot_driver/roboteq_driver.hpp | 12 +- .../robot_driver/roboteq_error_filter.hpp | 10 +- .../robot_driver/roboteq_robot_driver.hpp | 18 +- .../panther_system/system_e_stop.hpp | 16 +- .../panther_system/system_ros_interface.hpp | 14 +- .../panther_system/ugv_system.hpp | 22 +-- .../utils.hpp | 10 +- .../package.xml | 4 +- .../panther_imu_sensor/panther_imu_sensor.cpp | 8 +- .../panther_system/gpio/gpio_controller.cpp | 10 +- .../src/panther_system/gpio/gpio_driver.cpp | 12 +- .../src/panther_system/lynx_system.cpp | 17 +- .../src/panther_system/panther_system.cpp | 18 +- .../robot_driver/canopen_manager.cpp | 12 +- .../robot_driver/lynx_robot_driver.cpp | 10 +- .../robot_driver/panther_robot_driver.cpp | 10 +- .../robot_driver/roboteq_data_converters.cpp | 14 +- .../robot_driver/roboteq_driver.cpp | 10 +- .../robot_driver/roboteq_error_filter.cpp | 6 +- .../robot_driver/roboteq_robot_driver.cpp | 14 +- .../src/panther_system/system_e_stop.cpp | 6 +- .../panther_system/system_ros_interface.cpp | 8 +- .../src/panther_system/ugv_system.cpp | 16 +- .../src/utils.cpp | 6 +- .../test/config/canopen_configuration.yaml | 0 .../test/config/slave_1.bin | Bin .../test_panther_imu_sensor.cpp | 14 +- .../gpio/test_gpio_controller.cpp | 12 +- .../panther_system/gpio/test_gpio_driver.cpp | 26 +-- .../test/test_utils.cpp | 14 +- .../robot_driver/test_canopen_manager.cpp | 20 +-- .../robot_driver/test_lynx_robot_driver.cpp | 57 ++++--- .../test_panther_robot_driver.cpp | 78 ++++----- .../test_roboteq_data_converters.cpp | 49 +++--- .../robot_driver/test_roboteq_driver.cpp | 68 ++++---- .../test_roboteq_error_filter.cpp | 34 ++-- .../test_roboteq_robot_driver.cpp | 108 ++++++------ .../unit/panther_system/test_lynx_system.cpp | 112 ++++++------ .../panther_system/test_panther_system.cpp | 159 ++++++++++-------- .../test_system_ros_interface.cpp | 27 +-- .../unit/panther_system/test_ugv_system.cpp | 31 ++-- .../test/utils/fake_can_socket.hpp | 10 +- .../test/utils/mock_driver.hpp | 26 +-- .../test/utils/mock_roboteq.hpp | 14 +- .../test/utils/panther_system_test_utils.hpp | 10 +- .../test/utils/system_test_utils.hpp | 41 ++--- .../test/utils/test_constants.hpp | 20 +-- .../.docs/AUTONOMOUS_ACTION.webp | Bin .../.docs/BATTERY_STATE.webp | Bin .../.docs/CHARGING_BATTERY.webp | Bin .../.docs/CRITICAL_BATTERY.webp | Bin .../.docs/ERROR.webp | Bin .../.docs/E_STOP.webp | Bin .../.docs/GOAL_ACHIEVED.webp | Bin .../.docs/LOW_BATTERY.webp | Bin .../.docs/MANUAL_ACTION.webp | Bin .../.docs/READY.webp | Bin .../CHANGELOG.rst | 0 .../CMakeLists.txt | 43 +++-- .../CONFIGURATION.md | 22 +-- .../LIGHTS_API.md | 4 +- .../README.md | 12 +- .../animations/lynx/battery_critical.png | Bin .../animations/lynx/battery_low.png | Bin .../animations/lynx/strip01_purple.png | Bin .../animations/lynx/strip01_red.png | Bin .../animations/lynx/triangle01_blue.png | Bin .../animations/lynx/triangle01_cyan.png | Bin .../animations/lynx/triangle01_green.png | Bin .../animations/lynx/triangle01_orange.png | Bin .../animations/lynx/triangle01_purple.png | Bin .../animations/lynx/triangle01_red.png | Bin .../animations/lynx/triangle01_yellow.png | Bin .../animations/panther/battery_critical.png | Bin .../animations/panther/battery_low.png | Bin .../animations/panther/strip01_purple.png | Bin .../animations/panther/strip01_red.png | Bin .../animations/panther/triangle01_blue.png | Bin .../animations/panther/triangle01_cyan.png | Bin .../animations/panther/triangle01_green.png | Bin .../animations/panther/triangle01_orange.png | Bin .../animations/panther/triangle01_purple.png | Bin .../animations/panther/triangle01_red.png | Bin .../animations/panther/triangle01_yellow.png | Bin .../config/lynx_animations.yaml | 34 ++-- .../config/lynx_driver.yaml | 0 .../config/panther_animations.yaml | 34 ++-- .../config/panther_driver.yaml | 0 .../animation/animation.hpp | 16 +- .../animation/charging_animation.hpp | 12 +- .../animation/image_animation.hpp | 12 +- .../include/husarion_ugv_lights}/apa102.hpp | 10 +- .../led_components/led_animations_queue.hpp | 12 +- .../led_components/led_panel.hpp | 10 +- .../led_components/led_segment.hpp | 18 +- .../led_components/segment_converter.hpp | 14 +- .../lights_controller_node.hpp | 18 +- .../lights_driver_node.hpp | 12 +- .../launch/lights.launch.py | 10 +- .../package.xml | 6 +- husarion_ugv_lights/plugins.xml | 8 + .../src/animation/charging_animation.cpp | 8 +- .../src/animation/image_animation.cpp | 14 +- .../src/apa102.cpp | 6 +- .../led_components/led_animations_queue.cpp | 6 +- .../src/led_components/led_panel.cpp | 6 +- .../src/led_components/led_segment.cpp | 22 +-- .../src/led_components/segment_converter.cpp | 10 +- .../src/lights_controller_node.cpp | 51 +++--- .../src/lights_driver_node.cpp | 10 +- .../test/files/animation.png | Bin .../test/integration/panther_lights.test.py | 10 +- .../test/unit/animation/test_animation.cpp | 4 +- .../animation/test_charging_animation.cpp | 4 +- .../unit/animation/test_image_animation.cpp | 12 +- .../led_components/test_led_animation.cpp | 30 ++-- .../test_led_animations_queue.cpp | 82 ++++----- .../unit/led_components/test_led_panel.cpp | 8 +- .../unit/led_components/test_led_segment.cpp | 106 ++++++------ .../led_components/test_segment_converter.cpp | 54 +++--- .../test/unit/test_apa102.cpp | 6 +- .../test/unit/test_lights_controller_node.cpp | 29 ++-- .../test/unit/test_lights_driver_node.cpp | 14 +- .../CHANGELOG.rst | 0 .../CMakeLists.txt | 2 +- .../README.md | 2 +- .../config/enu_localization.yaml | 2 +- .../config/enu_localization_with_gps.yaml | 2 +- .../config/nmea_navsat_params.yaml | 0 .../config/relative_localization.yaml | 2 +- .../relative_localization_with_gps.yaml | 2 +- .../launch/localization.launch.py | 4 +- .../launch/nmea_navsat.launch.py | 2 +- .../package.xml | 4 +- .../CHANGELOG.rst | 0 .../CMakeLists.txt | 23 +-- .../CONFIGURATION.md | 6 +- .../README.md | 8 +- .../behavior_trees/PantherLightsBT.btproj | 0 .../behavior_trees/PantherSafetyBT.btproj | 0 .../behavior_trees/lights.xml | 0 .../behavior_trees/safety.xml | 0 .../behavior_trees/shutdown.xml | 0 .../config/lights_manager.yaml | 0 .../config/safety_manager.yaml | 0 .../config/shutdown_hosts.yaml | 0 .../behavior_tree_manager.hpp | 10 +- .../behavior_tree_utils.hpp | 14 +- .../lights_manager_node.hpp | 16 +- .../action/call_set_bool_service_node.hpp | 10 +- .../call_set_led_animation_service_node.hpp | 10 +- .../action/call_trigger_service_node.hpp | 10 +- .../action/shutdown_hosts_from_file_node.hpp | 16 +- .../action/shutdown_single_host_node.hpp | 14 +- .../plugins/action/signal_shutdown_node.hpp | 10 +- .../decorator/tick_after_timeout_node.hpp | 10 +- .../plugins/shutdown_host.hpp | 10 +- .../plugins/shutdown_hosts_node.hpp | 14 +- .../safety_manager_node.hpp | 20 +-- .../launch/manager.launch.py | 16 +- .../package.xml | 6 +- .../src/behavior_tree_manager.cpp | 6 +- .../src/lights_manager_node.cpp | 20 +-- .../src/lights_manager_node_main.cpp | 5 +- .../action/call_set_bool_service_node.cpp | 10 +- .../call_set_led_animation_service_node.cpp | 10 +- .../action/call_trigger_service_node.cpp | 10 +- .../action/shutdown_hosts_from_file_node.cpp | 24 +-- .../action/shutdown_single_host_node.cpp | 12 +- .../plugins/action/signal_shutdown_node.cpp | 8 +- .../decorator/tick_after_timeout_node.cpp | 8 +- .../src/safety_manager_node.cpp | 24 +-- .../src/safety_manager_node_main.cpp | 5 +- .../test_call_set_bool_service_node.cpp | 16 +- ...st_call_set_led_animation_service_node.cpp | 26 ++- .../action/test_call_trigger_service_node.cpp | 14 +- .../test_shutdown_hosts_from_file_node.cpp | 21 +-- .../action/test_shutdown_single_host_node.cpp | 16 +- .../action/test_signal_shutdown_node.cpp | 8 +- .../test_tick_after_timeout_node.cpp | 6 +- .../test/plugins/test_shutdown_host.cpp | 36 ++-- .../test/plugins/test_shutdown_hosts_node.cpp | 50 +++--- .../test/test_behavior_tree_manager.cpp | 10 +- .../test/test_behavior_tree_utils.cpp | 10 +- .../test/test_lights_behavior_tree.cpp | 4 +- .../test/test_lights_manager_node.cpp | 10 +- .../test/test_safety_behavior_tree.cpp | 4 +- .../test/test_safety_manager_node.cpp | 16 +- .../test/utils/behavior_tree_test_utils.hpp | 6 +- .../test/utils/plugin_test_utils.hpp | 26 +-- .../CHANGELOG.rst | 0 .../CMakeLists.txt | 2 +- .../README.md | 4 +- .../husarion_ugv_utils}/__init__.py | 0 .../integration_test_utils.py | 0 .../husarion_ugv_utils}/messages.py | 0 .../husarion_ugv_utils}/common_utilities.hpp | 10 +- .../husarion_ugv_utils}/configure_rt.hpp | 10 +- .../husarion_ugv_utils}/diagnostics.hpp | 10 +- .../husarion_ugv_utils}/moving_average.hpp | 10 +- .../include/husarion_ugv_utils}/ros_utils.hpp | 10 +- .../test/ros_test_utils.hpp | 10 +- .../husarion_ugv_utils}/test/test_utils.hpp | 10 +- .../husarion_ugv_utils}/yaml_utils.hpp | 10 +- .../package.xml | 2 +- .../test/test_common_utilities.cpp | 41 ++--- .../test/test_diagnostics.cpp | 12 +- .../test/test_moving_average.cpp | 20 +-- .../test/test_ros_test_utils.cpp | 8 +- .../test/test_ros_utils.cpp | 27 +-- .../test/test_test_utils.cpp | 28 +-- .../test/test_yaml_utils.cpp | 36 ++-- lynx_description/launch/load_urdf.launch.py | 4 +- lynx_description/urdf/lynx.urdf.xacro | 2 +- lynx_description/urdf/lynx_macro.urdf.xacro | 6 +- panther/README.md | 3 - panther_controller/CONFIGURATION.md | 9 - .../launch/load_urdf.launch.py | 4 +- panther_description/urdf/gazebo.urdf.xacro | 2 +- panther_description/urdf/panther.urdf.xacro | 2 +- .../urdf/panther_macro.urdf.xacro | 6 +- panther_lights/plugins.xml | 8 - 339 files changed, 2069 insertions(+), 1989 deletions(-) delete mode 100644 .docs/panther_ros2_api.drawio.svg create mode 100644 .docs/ros2_system_design.drawio.svg rename {panther => husarion_ugv}/CHANGELOG.rst (100%) rename {panther => husarion_ugv}/CMakeLists.txt (80%) create mode 100644 husarion_ugv/README.md rename panther/panther_hardware.repos => husarion_ugv/hardware_deps.repos (100%) rename {panther => husarion_ugv}/package.xml (71%) rename panther/panther_simulation.repos => husarion_ugv/simulation_deps.repos (100%) rename {panther_battery => husarion_ugv_battery}/CHANGELOG.rst (100%) rename {panther_battery => husarion_ugv_battery}/CMakeLists.txt (97%) rename {panther_battery => husarion_ugv_battery}/README.md (75%) rename {panther_battery/include/panther_battery => husarion_ugv_battery/include/husarion_ugv_battery}/adc_data_reader.hpp (90%) rename {panther_battery/include/panther_battery => husarion_ugv_battery/include/husarion_ugv_battery}/battery/adc_battery.hpp (83%) rename {panther_battery/include/panther_battery => husarion_ugv_battery/include/husarion_ugv_battery}/battery/battery.hpp (95%) rename {panther_battery/include/panther_battery => husarion_ugv_battery/include/husarion_ugv_battery}/battery/roboteq_battery.hpp (81%) rename {panther_battery/include/panther_battery => husarion_ugv_battery/include/husarion_ugv_battery}/battery_driver_node.hpp (80%) rename {panther_battery/include/panther_battery => husarion_ugv_battery/include/husarion_ugv_battery}/battery_publisher/battery_publisher.hpp (88%) rename {panther_battery/include/panther_battery => husarion_ugv_battery/include/husarion_ugv_battery}/battery_publisher/dual_battery_publisher.hpp (84%) rename {panther_battery/include/panther_battery => husarion_ugv_battery/include/husarion_ugv_battery}/battery_publisher/single_battery_publisher.hpp (78%) rename {panther_battery => husarion_ugv_battery}/launch/battery.launch.py (97%) rename {panther_battery => husarion_ugv_battery}/package.xml (93%) rename {panther_battery => husarion_ugv_battery}/src/battery/adc_battery.cpp (93%) rename {panther_battery => husarion_ugv_battery}/src/battery/roboteq_battery.cpp (94%) rename {panther_battery => husarion_ugv_battery}/src/battery_driver_node.cpp (91%) rename {panther_battery => husarion_ugv_battery}/src/battery_publisher/battery_publisher.cpp (96%) rename {panther_battery => husarion_ugv_battery}/src/battery_publisher/dual_battery_publisher.cpp (96%) rename {panther_battery => husarion_ugv_battery}/src/battery_publisher/single_battery_publisher.cpp (92%) rename {panther_battery => husarion_ugv_battery}/src/main.cpp (86%) rename {panther_battery => husarion_ugv_battery}/test/battery/test_adc_battery.cpp (93%) rename {panther_battery => husarion_ugv_battery}/test/battery/test_battery.cpp (93%) rename {panther_battery => husarion_ugv_battery}/test/battery/test_roboteq_battery.cpp (92%) rename {panther_battery => husarion_ugv_battery}/test/battery_publisher/test_battery_publisher.cpp (94%) rename {panther_battery => husarion_ugv_battery}/test/battery_publisher/test_dual_battery_publisher.cpp (93%) rename {panther_battery => husarion_ugv_battery}/test/battery_publisher/test_single_battery_publisher.cpp (75%) rename {panther_battery => husarion_ugv_battery}/test/test_adc_data_reader.cpp (92%) rename {panther_battery => husarion_ugv_battery}/test/test_battery_driver_node_adc_dual.cpp (91%) rename {panther_battery => husarion_ugv_battery}/test/test_battery_driver_node_adc_single.cpp (91%) rename {panther_battery => husarion_ugv_battery}/test/test_battery_driver_node_roboteq.cpp (93%) rename {panther_battery => husarion_ugv_battery}/test/utils/test_battery_driver_node.hpp (93%) rename {panther_bringup => husarion_ugv_bringup}/CHANGELOG.rst (100%) rename {panther_bringup => husarion_ugv_bringup}/CMakeLists.txt (83%) rename {panther_bringup => husarion_ugv_bringup}/README.md (87%) rename {panther_bringup => husarion_ugv_bringup}/launch/bringup.launch.py (87%) rename {panther_bringup => husarion_ugv_bringup}/package.xml (80%) rename {panther_controller => husarion_ugv_controller}/CHANGELOG.rst (100%) rename {panther_localization => husarion_ugv_controller}/CMakeLists.txt (82%) create mode 100644 husarion_ugv_controller/CONFIGURATION.md rename {panther_controller => husarion_ugv_controller}/README.md (95%) rename {panther_controller => husarion_ugv_controller}/config/WH01_controller.yaml (100%) rename {panther_controller => husarion_ugv_controller}/config/WH02_controller.yaml (100%) rename {panther_controller => husarion_ugv_controller}/config/WH04_controller.yaml (98%) rename {panther_controller => husarion_ugv_controller}/config/WH05_controller.yaml (100%) rename {panther_controller => husarion_ugv_controller}/launch/controller.launch.py (97%) rename {panther_controller => husarion_ugv_controller}/package.xml (88%) rename {panther_diagnostics => husarion_ugv_diagnostics}/CHANGELOG.rst (100%) rename {panther_diagnostics => husarion_ugv_diagnostics}/CMakeLists.txt (97%) rename {panther_diagnostics => husarion_ugv_diagnostics}/README.md (95%) rename {panther_diagnostics => husarion_ugv_diagnostics}/cmake/SuperBuild.cmake (97%) rename {panther_diagnostics => husarion_ugv_diagnostics}/config/system_monitor.yaml (100%) rename {panther_diagnostics/include/panther_diagnostics => husarion_ugv_diagnostics/include/husarion_ugv_diagnostics}/filesystem.hpp (93%) rename {panther_diagnostics/include/panther_diagnostics => husarion_ugv_diagnostics/include/husarion_ugv_diagnostics}/system_monitor_node.hpp (87%) rename {panther_diagnostics/include/panther_diagnostics => husarion_ugv_diagnostics/include/husarion_ugv_diagnostics}/types.hpp (82%) rename {panther_diagnostics => husarion_ugv_diagnostics}/launch/system_monitor.launch.py (97%) rename {panther_diagnostics => husarion_ugv_diagnostics}/package.xml (87%) rename {panther_diagnostics => husarion_ugv_diagnostics}/src/main.cpp (80%) rename {panther_diagnostics => husarion_ugv_diagnostics}/src/system_monitor_node.cpp (89%) rename {panther_diagnostics => husarion_ugv_diagnostics}/test/integration/system_monitor_node.test.py (97%) rename {panther_diagnostics => husarion_ugv_diagnostics}/test/unit/test_filesystem.cpp (91%) rename {panther_diagnostics => husarion_ugv_diagnostics}/test/unit/test_system_monitor_node.cpp (83%) rename {panther_gazebo => husarion_ugv_gazebo}/CHANGELOG.rst (100%) rename {panther_gazebo => husarion_ugv_gazebo}/CMakeLists.txt (82%) rename {panther_gazebo => husarion_ugv_gazebo}/CONFIGURATION.md (71%) rename {panther_gazebo => husarion_ugv_gazebo}/README.md (98%) rename {panther_gazebo => husarion_ugv_gazebo}/config/battery_plugin.yaml (82%) rename {panther_gazebo => husarion_ugv_gazebo}/config/gz_bridge.yaml (100%) rename {panther_gazebo => husarion_ugv_gazebo}/config/teleop_with_estop.config (100%) rename panther_gazebo/hooks/panther_gazebo.sh.in => husarion_ugv_gazebo/hooks/husarion_ugv_gazebo.sh.in (100%) rename panther_gazebo/include/panther_gazebo/gz_panther_system.hpp => husarion_ugv_gazebo/include/husarion_ugv_gazebo/estop_system.hpp (90%) rename {panther_gazebo/include/panther_gazebo => husarion_ugv_gazebo/include/husarion_ugv_gazebo}/gui/e_stop.hpp (89%) rename {panther_gazebo/include/panther_gazebo => husarion_ugv_gazebo/include/husarion_ugv_gazebo}/led_strip.hpp (96%) rename {panther_gazebo => husarion_ugv_gazebo}/launch/simulate_robot.launch.py (91%) rename {panther_gazebo => husarion_ugv_gazebo}/launch/simulation.launch.py (94%) rename {panther_gazebo => husarion_ugv_gazebo}/launch/spawn_robot.launch.py (98%) rename {panther_gazebo => husarion_ugv_gazebo}/package.xml (93%) rename panther_gazebo/panther_simulation_plugins.xml => husarion_ugv_gazebo/plugins.xml (62%) rename panther_gazebo/src/gz_panther_system.cpp => husarion_ugv_gazebo/src/estop_system.cpp (82%) rename {panther_gazebo => husarion_ugv_gazebo}/src/gui/EStop.qml (100%) rename {panther_gazebo => husarion_ugv_gazebo}/src/gui/EStop.qrc (100%) rename {panther_gazebo => husarion_ugv_gazebo}/src/gui/e_stop.cpp (94%) rename {panther_gazebo => husarion_ugv_gazebo}/src/led_strip.cpp (97%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/CHANGELOG.rst (100%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/CMakeLists.txt (93%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/CODE_STRUCTURE.md (100%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/README.md (98%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/cmake/SuperBuild.cmake (98%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/config/canopen_configuration.yaml (100%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/config/master.dcf (100%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/config/phidgets_spatial_parameters.yaml (100%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/config/roboteq_motor_controllers_v80_21a.eds (100%) rename panther_hardware_interfaces/panther_hardware_interfaces.xml => husarion_ugv_hardware_interfaces/husarion_ugv_hardware_interfaces.xml (57%) rename {panther_hardware_interfaces/include/panther_hardware_interfaces => husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces}/panther_imu_sensor/panther_imu_sensor.hpp (94%) rename {panther_hardware_interfaces/include/panther_hardware_interfaces => husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces}/panther_system/gpio/gpio_controller.hpp (95%) rename {panther_hardware_interfaces/include/panther_hardware_interfaces => husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces}/panther_system/gpio/gpio_driver.hpp (95%) rename {panther_hardware_interfaces/include/panther_hardware_interfaces => husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces}/panther_system/gpio/types.hpp (87%) rename {panther_hardware_interfaces/include/panther_hardware_interfaces => husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces}/panther_system/lynx_system.hpp (79%) rename {panther_hardware_interfaces/include/panther_hardware_interfaces => husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces}/panther_system/panther_system.hpp (79%) rename {panther_hardware_interfaces/include/panther_hardware_interfaces => husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces}/panther_system/robot_driver/canopen_manager.hpp (91%) rename {panther_hardware_interfaces/include/panther_hardware_interfaces => husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces}/panther_system/robot_driver/driver.hpp (91%) rename {panther_hardware_interfaces/include/panther_hardware_interfaces => husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces}/panther_system/robot_driver/lynx_robot_driver.hpp (75%) rename {panther_hardware_interfaces/include/panther_hardware_interfaces => husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces}/panther_system/robot_driver/panther_robot_driver.hpp (75%) rename {panther_hardware_interfaces/include/panther_hardware_interfaces => husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces}/panther_system/robot_driver/robot_driver.hpp (86%) rename {panther_hardware_interfaces/include/panther_hardware_interfaces => husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces}/panther_system/robot_driver/roboteq_data_converters.hpp (93%) rename {panther_hardware_interfaces/include/panther_hardware_interfaces => husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces}/panther_system/robot_driver/roboteq_driver.hpp (92%) rename {panther_hardware_interfaces/include/panther_hardware_interfaces => husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces}/panther_system/robot_driver/roboteq_error_filter.hpp (89%) rename {panther_hardware_interfaces/include/panther_hardware_interfaces => husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces}/panther_system/robot_driver/roboteq_robot_driver.hpp (86%) rename {panther_hardware_interfaces/include/panther_hardware_interfaces => husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces}/panther_system/system_e_stop.hpp (86%) rename {panther_hardware_interfaces/include/panther_hardware_interfaces => husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces}/panther_system/system_ros_interface.hpp (95%) rename {panther_hardware_interfaces/include/panther_hardware_interfaces => husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces}/panther_system/ugv_system.hpp (88%) rename {panther_hardware_interfaces/include/panther_hardware_interfaces => husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces}/utils.hpp (89%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/package.xml (95%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/src/panther_imu_sensor/panther_imu_sensor.cpp (98%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/src/panther_system/gpio/gpio_controller.cpp (96%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/src/panther_system/gpio/gpio_driver.cpp (95%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/src/panther_system/lynx_system.cpp (92%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/src/panther_system/panther_system.cpp (93%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/src/panther_system/robot_driver/canopen_manager.cpp (92%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/src/panther_system/robot_driver/lynx_robot_driver.cpp (85%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/src/panther_system/robot_driver/panther_robot_driver.cpp (90%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/src/panther_system/robot_driver/roboteq_data_converters.cpp (95%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/src/panther_system/robot_driver/roboteq_driver.cpp (96%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/src/panther_system/robot_driver/roboteq_error_filter.cpp (93%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/src/panther_system/robot_driver/roboteq_robot_driver.cpp (93%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/src/panther_system/system_e_stop.cpp (93%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/src/panther_system/system_ros_interface.cpp (97%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/src/panther_system/ugv_system.cpp (97%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/src/utils.cpp (93%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/test/config/canopen_configuration.yaml (100%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/test/config/slave_1.bin (100%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/test/panther_imu_sensor/test_panther_imu_sensor.cpp (97%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/test/panther_system/gpio/test_gpio_controller.cpp (93%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/test/panther_system/gpio/test_gpio_driver.cpp (84%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/test/test_utils.cpp (86%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/test/unit/panther_system/robot_driver/test_canopen_manager.cpp (74%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/test/unit/panther_system/robot_driver/test_lynx_robot_driver.cpp (58%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/test/unit/panther_system/robot_driver/test_panther_robot_driver.cpp (55%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/test/unit/panther_system/robot_driver/test_roboteq_data_converters.cpp (86%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/test/unit/panther_system/robot_driver/test_roboteq_driver.cpp (80%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/test/unit/panther_system/robot_driver/test_roboteq_error_filter.cpp (87%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/test/unit/panther_system/robot_driver/test_roboteq_robot_driver.cpp (81%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/test/unit/panther_system/test_lynx_system.cpp (64%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/test/unit/panther_system/test_panther_system.cpp (59%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/test/unit/panther_system/test_system_ros_interface.cpp (87%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/test/unit/panther_system/test_ugv_system.cpp (90%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/test/utils/fake_can_socket.hpp (86%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/test/utils/mock_driver.hpp (63%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/test/utils/mock_roboteq.hpp (95%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/test/utils/panther_system_test_utils.hpp (92%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/test/utils/system_test_utils.hpp (75%) rename {panther_hardware_interfaces => husarion_ugv_hardware_interfaces}/test/utils/test_constants.hpp (78%) rename {panther_lights => husarion_ugv_lights}/.docs/AUTONOMOUS_ACTION.webp (100%) rename {panther_lights => husarion_ugv_lights}/.docs/BATTERY_STATE.webp (100%) rename {panther_lights => husarion_ugv_lights}/.docs/CHARGING_BATTERY.webp (100%) rename {panther_lights => husarion_ugv_lights}/.docs/CRITICAL_BATTERY.webp (100%) rename {panther_lights => husarion_ugv_lights}/.docs/ERROR.webp (100%) rename {panther_lights => husarion_ugv_lights}/.docs/E_STOP.webp (100%) rename {panther_lights => husarion_ugv_lights}/.docs/GOAL_ACHIEVED.webp (100%) rename {panther_lights => husarion_ugv_lights}/.docs/LOW_BATTERY.webp (100%) rename {panther_lights => husarion_ugv_lights}/.docs/MANUAL_ACTION.webp (100%) rename {panther_lights => husarion_ugv_lights}/.docs/READY.webp (100%) rename {panther_lights => husarion_ugv_lights}/CHANGELOG.rst (100%) rename {panther_lights => husarion_ugv_lights}/CMakeLists.txt (86%) rename {panther_lights => husarion_ugv_lights}/CONFIGURATION.md (88%) rename {panther_lights => husarion_ugv_lights}/LIGHTS_API.md (92%) rename {panther_lights => husarion_ugv_lights}/README.md (81%) rename {panther_lights => husarion_ugv_lights}/animations/lynx/battery_critical.png (100%) rename {panther_lights => husarion_ugv_lights}/animations/lynx/battery_low.png (100%) rename {panther_lights => husarion_ugv_lights}/animations/lynx/strip01_purple.png (100%) rename {panther_lights => husarion_ugv_lights}/animations/lynx/strip01_red.png (100%) rename {panther_lights => husarion_ugv_lights}/animations/lynx/triangle01_blue.png (100%) rename {panther_lights => husarion_ugv_lights}/animations/lynx/triangle01_cyan.png (100%) rename {panther_lights => husarion_ugv_lights}/animations/lynx/triangle01_green.png (100%) rename {panther_lights => husarion_ugv_lights}/animations/lynx/triangle01_orange.png (100%) rename {panther_lights => husarion_ugv_lights}/animations/lynx/triangle01_purple.png (100%) rename {panther_lights => husarion_ugv_lights}/animations/lynx/triangle01_red.png (100%) rename {panther_lights => husarion_ugv_lights}/animations/lynx/triangle01_yellow.png (100%) rename {panther_lights => husarion_ugv_lights}/animations/panther/battery_critical.png (100%) rename {panther_lights => husarion_ugv_lights}/animations/panther/battery_low.png (100%) rename {panther_lights => husarion_ugv_lights}/animations/panther/strip01_purple.png (100%) rename {panther_lights => husarion_ugv_lights}/animations/panther/strip01_red.png (100%) rename {panther_lights => husarion_ugv_lights}/animations/panther/triangle01_blue.png (100%) rename {panther_lights => husarion_ugv_lights}/animations/panther/triangle01_cyan.png (100%) rename {panther_lights => husarion_ugv_lights}/animations/panther/triangle01_green.png (100%) rename {panther_lights => husarion_ugv_lights}/animations/panther/triangle01_orange.png (100%) rename {panther_lights => husarion_ugv_lights}/animations/panther/triangle01_purple.png (100%) rename {panther_lights => husarion_ugv_lights}/animations/panther/triangle01_red.png (100%) rename {panther_lights => husarion_ugv_lights}/animations/panther/triangle01_yellow.png (100%) rename {panther_lights => husarion_ugv_lights}/config/lynx_animations.yaml (61%) rename {panther_lights => husarion_ugv_lights}/config/lynx_driver.yaml (100%) rename {panther_lights => husarion_ugv_lights}/config/panther_animations.yaml (60%) rename {panther_lights => husarion_ugv_lights}/config/panther_driver.yaml (100%) rename {panther_lights/include/panther_lights => husarion_ugv_lights/include/husarion_ugv_lights}/animation/animation.hpp (91%) rename {panther_lights/include/panther_lights => husarion_ugv_lights/include/husarion_ugv_lights}/animation/charging_animation.hpp (83%) rename {panther_lights/include/panther_lights => husarion_ugv_lights/include/husarion_ugv_lights}/animation/image_animation.hpp (88%) rename {panther_lights/include/panther_lights => husarion_ugv_lights/include/husarion_ugv_lights}/apa102.hpp (96%) rename {panther_lights/include/panther_lights => husarion_ugv_lights/include/husarion_ugv_lights}/led_components/led_animations_queue.hpp (94%) rename {panther_lights/include/panther_lights => husarion_ugv_lights/include/husarion_ugv_lights}/led_components/led_panel.hpp (85%) rename {panther_lights/include/panther_lights => husarion_ugv_lights/include/husarion_ugv_lights}/led_components/led_segment.hpp (87%) rename {panther_lights/include/panther_lights => husarion_ugv_lights/include/husarion_ugv_lights}/led_components/segment_converter.hpp (70%) rename {panther_lights/include/panther_lights => husarion_ugv_lights/include/husarion_ugv_lights}/lights_controller_node.hpp (91%) rename {panther_lights/include/panther_lights => husarion_ugv_lights/include/husarion_ugv_lights}/lights_driver_node.hpp (94%) rename {panther_lights => husarion_ugv_lights}/launch/lights.launch.py (93%) rename {panther_lights => husarion_ugv_lights}/package.xml (88%) create mode 100644 husarion_ugv_lights/plugins.xml rename {panther_lights => husarion_ugv_lights}/src/animation/charging_animation.cpp (95%) rename {panther_lights => husarion_ugv_lights}/src/animation/image_animation.cpp (93%) rename {panther_lights => husarion_ugv_lights}/src/apa102.cpp (97%) rename {panther_lights => husarion_ugv_lights}/src/led_components/led_animations_queue.cpp (96%) rename {panther_lights => husarion_ugv_lights}/src/led_components/led_panel.cpp (93%) rename {panther_lights => husarion_ugv_lights}/src/led_components/led_segment.cpp (86%) rename {panther_lights => husarion_ugv_lights}/src/led_components/segment_converter.cpp (85%) rename {panther_lights => husarion_ugv_lights}/src/lights_controller_node.cpp (86%) rename {panther_lights => husarion_ugv_lights}/src/lights_driver_node.cpp (97%) rename {panther_lights => husarion_ugv_lights}/test/files/animation.png (100%) rename {panther_lights => husarion_ugv_lights}/test/integration/panther_lights.test.py (94%) rename {panther_lights => husarion_ugv_lights}/test/unit/animation/test_animation.cpp (98%) rename {panther_lights => husarion_ugv_lights}/test/unit/animation/test_charging_animation.cpp (97%) rename {panther_lights => husarion_ugv_lights}/test/unit/animation/test_image_animation.cpp (94%) rename {panther_lights => husarion_ugv_lights}/test/unit/led_components/test_led_animation.cpp (79%) rename {panther_lights => husarion_ugv_lights}/test/unit/led_components/test_led_animations_queue.cpp (66%) rename {panther_lights => husarion_ugv_lights}/test/unit/led_components/test_led_panel.cpp (93%) rename {panther_lights => husarion_ugv_lights}/test/unit/led_components/test_led_segment.cpp (57%) rename {panther_lights => husarion_ugv_lights}/test/unit/led_components/test_segment_converter.cpp (69%) rename {panther_lights => husarion_ugv_lights}/test/unit/test_apa102.cpp (97%) rename {panther_lights => husarion_ugv_lights}/test/unit/test_lights_controller_node.cpp (87%) rename {panther_lights => husarion_ugv_lights}/test/unit/test_lights_driver_node.cpp (95%) rename {panther_localization => husarion_ugv_localization}/CHANGELOG.rst (100%) rename {panther_controller => husarion_ugv_localization}/CMakeLists.txt (82%) rename {panther_localization => husarion_ugv_localization}/README.md (98%) rename {panther_localization => husarion_ugv_localization}/config/enu_localization.yaml (99%) rename {panther_localization => husarion_ugv_localization}/config/enu_localization_with_gps.yaml (99%) rename {panther_localization => husarion_ugv_localization}/config/nmea_navsat_params.yaml (100%) rename {panther_localization => husarion_ugv_localization}/config/relative_localization.yaml (99%) rename {panther_localization => husarion_ugv_localization}/config/relative_localization_with_gps.yaml (99%) rename {panther_localization => husarion_ugv_localization}/launch/localization.launch.py (96%) rename {panther_localization => husarion_ugv_localization}/launch/nmea_navsat.launch.py (96%) rename {panther_localization => husarion_ugv_localization}/package.xml (87%) rename {panther_manager => husarion_ugv_manager}/CHANGELOG.rst (100%) rename {panther_manager => husarion_ugv_manager}/CMakeLists.txt (95%) rename {panther_manager => husarion_ugv_manager}/CONFIGURATION.md (96%) rename {panther_manager => husarion_ugv_manager}/README.md (95%) rename {panther_manager => husarion_ugv_manager}/behavior_trees/PantherLightsBT.btproj (100%) rename {panther_manager => husarion_ugv_manager}/behavior_trees/PantherSafetyBT.btproj (100%) rename {panther_manager => husarion_ugv_manager}/behavior_trees/lights.xml (100%) rename {panther_manager => husarion_ugv_manager}/behavior_trees/safety.xml (100%) rename {panther_manager => husarion_ugv_manager}/behavior_trees/shutdown.xml (100%) rename {panther_manager => husarion_ugv_manager}/config/lights_manager.yaml (100%) rename {panther_manager => husarion_ugv_manager}/config/safety_manager.yaml (100%) rename {panther_manager => husarion_ugv_manager}/config/shutdown_hosts.yaml (100%) rename {panther_manager/include/panther_manager => husarion_ugv_manager/include/husarion_ugv_manager}/behavior_tree_manager.hpp (92%) rename {panther_manager/include/panther_manager => husarion_ugv_manager/include/husarion_ugv_manager}/behavior_tree_utils.hpp (89%) rename {panther_manager/include/panther_manager => husarion_ugv_manager/include/husarion_ugv_manager}/lights_manager_node.hpp (84%) rename {panther_manager/include/panther_manager => husarion_ugv_manager/include/husarion_ugv_manager}/plugins/action/call_set_bool_service_node.hpp (81%) rename {panther_manager/include/panther_manager => husarion_ugv_manager/include/husarion_ugv_manager}/plugins/action/call_set_led_animation_service_node.hpp (82%) rename {panther_manager/include/panther_manager => husarion_ugv_manager/include/husarion_ugv_manager}/plugins/action/call_trigger_service_node.hpp (81%) rename {panther_manager/include/panther_manager => husarion_ugv_manager/include/husarion_ugv_manager}/plugins/action/shutdown_hosts_from_file_node.hpp (71%) rename {panther_manager/include/panther_manager => husarion_ugv_manager/include/husarion_ugv_manager}/plugins/action/shutdown_single_host_node.hpp (78%) rename {panther_manager/include/panther_manager => husarion_ugv_manager/include/husarion_ugv_manager}/plugins/action/signal_shutdown_node.hpp (79%) rename {panther_manager/include/panther_manager => husarion_ugv_manager/include/husarion_ugv_manager}/plugins/decorator/tick_after_timeout_node.hpp (80%) rename {panther_manager/include/panther_manager => husarion_ugv_manager/include/husarion_ugv_manager}/plugins/shutdown_host.hpp (96%) rename {panther_manager/include/panther_manager => husarion_ugv_manager/include/husarion_ugv_manager}/plugins/shutdown_hosts_node.hpp (93%) rename {panther_manager/include/panther_manager => husarion_ugv_manager/include/husarion_ugv_manager}/safety_manager_node.hpp (84%) rename {panther_manager => husarion_ugv_manager}/launch/manager.launch.py (86%) rename {panther_manager => husarion_ugv_manager}/package.xml (92%) rename {panther_manager => husarion_ugv_manager}/src/behavior_tree_manager.cpp (94%) rename {panther_manager => husarion_ugv_manager}/src/lights_manager_node.cpp (94%) rename {panther_manager => husarion_ugv_manager}/src/lights_manager_node_main.cpp (86%) rename {panther_manager => husarion_ugv_manager}/src/plugins/action/call_set_bool_service_node.cpp (84%) rename {panther_manager => husarion_ugv_manager}/src/plugins/action/call_set_led_animation_service_node.cpp (86%) rename {panther_manager => husarion_ugv_manager}/src/plugins/action/call_trigger_service_node.cpp (83%) rename {panther_manager => husarion_ugv_manager}/src/plugins/action/shutdown_hosts_from_file_node.cpp (71%) rename {panther_manager => husarion_ugv_manager}/src/plugins/action/shutdown_single_host_node.cpp (86%) rename {panther_manager => husarion_ugv_manager}/src/plugins/action/signal_shutdown_node.cpp (83%) rename {panther_manager => husarion_ugv_manager}/src/plugins/decorator/tick_after_timeout_node.cpp (87%) rename {panther_manager => husarion_ugv_manager}/src/safety_manager_node.cpp (94%) rename {panther_manager => husarion_ugv_manager}/src/safety_manager_node_main.cpp (86%) rename {panther_manager => husarion_ugv_manager}/test/plugins/action/test_call_set_bool_service_node.cpp (85%) rename {panther_manager => husarion_ugv_manager}/test/plugins/action/test_call_set_led_animation_service_node.cpp (86%) rename {panther_manager => husarion_ugv_manager}/test/plugins/action/test_call_trigger_service_node.cpp (84%) rename {panther_manager => husarion_ugv_manager}/test/plugins/action/test_shutdown_hosts_from_file_node.cpp (77%) rename {panther_manager => husarion_ugv_manager}/test/plugins/action/test_shutdown_single_host_node.cpp (81%) rename {panther_manager => husarion_ugv_manager}/test/plugins/action/test_signal_shutdown_node.cpp (85%) rename {panther_manager => husarion_ugv_manager}/test/plugins/decorator/test_tick_after_timeout_node.cpp (89%) rename {panther_manager => husarion_ugv_manager}/test/plugins/test_shutdown_host.cpp (64%) rename {panther_manager => husarion_ugv_manager}/test/plugins/test_shutdown_hosts_node.cpp (63%) rename {panther_manager => husarion_ugv_manager}/test/test_behavior_tree_manager.cpp (91%) rename {panther_manager => husarion_ugv_manager}/test/test_behavior_tree_utils.cpp (90%) rename {panther_manager => husarion_ugv_manager}/test/test_lights_behavior_tree.cpp (98%) rename {panther_manager => husarion_ugv_manager}/test/test_lights_manager_node.cpp (94%) rename {panther_manager => husarion_ugv_manager}/test/test_safety_behavior_tree.cpp (98%) rename {panther_manager => husarion_ugv_manager}/test/test_safety_manager_node.cpp (94%) rename {panther_manager => husarion_ugv_manager}/test/utils/behavior_tree_test_utils.hpp (88%) rename {panther_manager => husarion_ugv_manager}/test/utils/plugin_test_utils.hpp (80%) rename {panther_utils => husarion_ugv_utils}/CHANGELOG.rst (100%) rename {panther_utils => husarion_ugv_utils}/CMakeLists.txt (99%) rename {panther_utils => husarion_ugv_utils}/README.md (52%) rename {panther_utils/panther_utils => husarion_ugv_utils/husarion_ugv_utils}/__init__.py (100%) rename {panther_utils/panther_utils => husarion_ugv_utils/husarion_ugv_utils}/integration_test_utils.py (100%) rename {panther_utils/panther_utils => husarion_ugv_utils/husarion_ugv_utils}/messages.py (100%) rename {panther_utils/include/panther_utils => husarion_ugv_utils/include/husarion_ugv_utils}/common_utilities.hpp (93%) rename {panther_utils/include/panther_utils => husarion_ugv_utils/include/husarion_ugv_utils}/configure_rt.hpp (87%) rename {panther_utils/include/panther_utils => husarion_ugv_utils/include/husarion_ugv_utils}/diagnostics.hpp (88%) rename {panther_utils/include/panther_utils => husarion_ugv_utils/include/husarion_ugv_utils}/moving_average.hpp (86%) rename {panther_utils/include/panther_utils => husarion_ugv_utils/include/husarion_ugv_utils}/ros_utils.hpp (94%) rename {panther_utils/include/panther_utils => husarion_ugv_utils/include/husarion_ugv_utils}/test/ros_test_utils.hpp (93%) rename {panther_utils/include/panther_utils => husarion_ugv_utils/include/husarion_ugv_utils}/test/test_utils.hpp (90%) rename {panther_utils/include/panther_utils => husarion_ugv_utils/include/husarion_ugv_utils}/yaml_utils.hpp (91%) rename {panther_utils => husarion_ugv_utils}/package.xml (97%) rename {panther_utils => husarion_ugv_utils}/test/test_common_utilities.cpp (67%) rename {panther_utils => husarion_ugv_utils}/test/test_diagnostics.cpp (84%) rename {panther_utils => husarion_ugv_utils}/test/test_moving_average.cpp (80%) rename {panther_utils => husarion_ugv_utils}/test/test_ros_test_utils.cpp (84%) rename {panther_utils => husarion_ugv_utils}/test/test_ros_utils.cpp (76%) rename {panther_utils => husarion_ugv_utils}/test/test_test_utils.cpp (66%) rename {panther_utils => husarion_ugv_utils}/test/test_yaml_utils.cpp (53%) delete mode 100644 panther/README.md delete mode 100644 panther_controller/CONFIGURATION.md delete mode 100644 panther_lights/plugins.xml diff --git a/.docs/panther_ros2_api.drawio.svg b/.docs/panther_ros2_api.drawio.svg deleted file mode 100644 index 19f5bf614..000000000 --- a/.docs/panther_ros2_api.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
panther_localization
panther_localization
panther_controller
panther_controller
panther_lights
panther_lights
panther_hardware_interfaces
panther_hardware_interfaces
panther_battery
panther_battery
panther_manager
panther_manager
panther_diagnostics
panther_diagnostics
PantherSystem
PantherSystem
hardware_controller
hardware_controller
GPIOController
GPIOController
MotorsController
MotorsController
CANopenController
CANopenController
RoboteqDriver
RoboteqDriver
CAN
CAN
EStopManager
EStopManager
battery_driver
battery_driver
RPi GPIO
RPi GPIO
ADC
ADC
imu_broadcaster
imu_broadcaster
joint_state_broadcaster
joint_state_broadcaster
drive_controller
drive_controller
controller_manager
controller_manager
PantherImuSensor

PantherImuSensor
IMU
IMU
ekf_filter
ekf_filter
ImuFilter
ImuFilter
Spatial
Spatial
imu/data
imu/data
odometry/wheels
odometry/wheels
odometry/filtered
odometry/filtered
joint_states
joint_states
cmd_vel
cmd_vel
dynamic_joint_states
dynamic_joint_states
 hardware/e_stop
 hardware/e_stop
hardware/robot_driver_state
hardware/robot_driver_state
 hardware/io_state
 hardware/io_state
hardware/e_stop_trigger
hardware/e_stop_trigger
hardware/e_stop_reset
hardware/e_stop_reset
hardware/<hw_component>_enable
hardware/<hw_component>_enable
robot_state_publisher
robot_state_publisher
robot_description
robot_description
/tf
/tf
/tf_static
/tf_static
/tf
/tf
battery/battery_status
battery/battery_status
Bumper Lights
Bumper Lights
lights_driver
lights_driver
lights_controller
lights_controller
lights/channel_1_frame
lights/channel_1_frame
lights/channel_2_frame
lights/channel_2_frame
lights/set_animation
lights/set_animation
lights/set_brightness
lights/set_brightness
safety_manager
safety_manager
system_monitor
system_monitor
system_status
system_status
lights_manager
lights_manager
hardware/led_control_enable
hardware/led_control_enable
/tf
/tf
battery/charging_status
battery/charging_status
GPIODriver
GPIODriver
diagnostics
diagnostics
diagnostics
diagnostics
diagnostics
diagnostics

diagnostics
diagnostics
Legend:
Legend:
Nodes
Nodes
Plugin
Plugin
Objects
Objects
Topics
Topics
Services
Services
Data Transfer
Data Trans...
Text is not SVG - cannot display
diff --git a/.docs/ros2_system_design.drawio.svg b/.docs/ros2_system_design.drawio.svg new file mode 100644 index 000000000..ee8bfd806 --- /dev/null +++ b/.docs/ros2_system_design.drawio.svg @@ -0,0 +1,4 @@ + + + +
husarion_ugv_localization
husarion_ugv_localization
husarion_ugv_controller
husarion_ugv_controller
husarion_ugv_lights
husarion_ugv_lights
husarion_ugv_hardware_interfaces
husarion_ugv_hardware_interfaces
husarion_ugv_battery
husarion_ugv_battery
husarion_ugv_manager
husarion_ugv_manager
husarion_ugv_diagnostics
husarion_ugv_diagnostics
HusarionUGVSystem
HusarionUGVSystem
hardware_controller
hardware_controller
GPIOController
GPIOController
MotorsController
MotorsController
CANopenController
CANopenController
RoboteqDriver
RoboteqDriver
CAN
CAN
EStopManager
EStopManager
battery_driver
battery_driver
RPi GPIO
RPi GPIO
ADC
ADC
imu_broadcaster
imu_broadcaster
joint_state_broadcaster
joint_state_broadcaster
drive_controller
drive_controller
controller_manager
controller_manager
HusarionUGVImuSensor

HusarionUGVImuSensor
IMU
IMU
ekf_filter
ekf_filter
ImuFilter
ImuFilter
Spatial
Spatial
imu/data
imu/data
odometry/wheels
odometry/wheels
odometry/filtered
odometry/filtered
joint_states
joint_states
cmd_vel
cmd_vel
dynamic_joint_states
dynamic_joint_states
 hardware/e_stop
 hardware/e_stop
hardware/robot_driver_state
hardware/robot_driver_state
 hardware/io_state
 hardware/io_state
hardware/e_stop_trigger
hardware/e_stop_trigger
hardware/e_stop_reset
hardware/e_stop_reset
hardware/<hw_component>_enable
hardware/<hw_component>_enable
robot_state_publisher
robot_state_publisher
robot_description
robot_description
/tf
/tf
/tf_static
/tf_static
/tf
/tf
battery/battery_status
battery/battery_status
Bumper Lights
Bumper Lights
lights_driver
lights_driver
lights_controller
lights_controller
lights/channel_1_frame
lights/channel_1_frame
lights/channel_2_frame
lights/channel_2_frame
lights/set_animation
lights/set_animation
lights/set_brightness
lights/set_brightness
safety_manager
safety_manager
system_monitor
system_monitor
system_status
system_status
lights_manager
lights_manager
hardware/led_control_enable
hardware/led_control_enable
/tf
/tf
battery/charging_status
battery/charging_status
GPIODriver
GPIODriver
diagnostics
diagnostics
diagnostics
diagnostics
diagnostics
diagnostics

diagnostics
diagnostics
Legend:
Legend:
Nodes
Nodes
Plugin
Plugin
Objects
Objects
Topics
Topics
Services
Services
Data Transfer
Data Trans...
Text is not SVG - cannot display
diff --git a/.github/workflows/release-project.yaml b/.github/workflows/release-project.yaml index 47800b4f5..8bdbcade4 100644 --- a/.github/workflows/release-project.yaml +++ b/.github/workflows/release-project.yaml @@ -1,5 +1,5 @@ --- -name: Release Panther project +name: Release project on: workflow_dispatch: diff --git a/.github/workflows/run-unit-tests.yaml b/.github/workflows/run-unit-tests.yaml index 6d7d48783..48c1ebf69 100644 --- a/.github/workflows/run-unit-tests.yaml +++ b/.github/workflows/run-unit-tests.yaml @@ -1,5 +1,5 @@ --- -name: Run panther unit tests +name: Run unit tests on: workflow_dispatch: @@ -28,12 +28,12 @@ jobs: uses: actions/checkout@v3 with: ref: ${{ github.ref }} - path: ros2_ws/src/panther_ros + path: ros2_ws/src/husarion_ugv - name: Resolve dependencies working-directory: ros2_ws run: | - vcs import < src/panther_ros/panther/panther_hardware.repos src + vcs import < src/husarion_ugv/husarion_ugv/hardware_deps.repos src sudo apt update rosdep update --rosdistro $ROS_DISTRO rosdep install -i --from-path src --rosdistro $ROS_DISTRO -y @@ -43,15 +43,15 @@ jobs: run: | source /opt/ros/$ROS_DISTRO/setup.bash if [ -f install/setup.bash ]; then source install/setup.bash; fi - colcon build --symlink-install --parallel-workers $(nproc) --packages-up-to panther --cmake-args -DCMAKE_CXX_FLAGS='-fprofile-arcs -ftest-coverage' + colcon build --symlink-install --parallel-workers $(nproc) --packages-up-to husarion_ugv --cmake-args -DCMAKE_CXX_FLAGS='-fprofile-arcs -ftest-coverage' - name: Test working-directory: ros2_ws run: | source install/setup.bash - colcon test --packages-up-to panther --retest-until-pass 10 --event-handlers console_cohesion+ --return-code-on-test-failure + colcon test --packages-up-to husarion_ugv --retest-until-pass 10 --event-handlers console_cohesion+ --return-code-on-test-failure echo "result=$?" >> ${{ runner.temp }}/${{ env.TEST_RESULT_FILENAME }} - colcon lcov-result --packages-up-to panther --verbose >> ${{ runner.temp }}/${{ env.COVERAGE_RESULT_FILENAME }} + colcon lcov-result --packages-up-to husarion_ugv --verbose >> ${{ runner.temp }}/${{ env.COVERAGE_RESULT_FILENAME }} lines_cov=$(cat ${{ runner.temp }}/${{ env.COVERAGE_RESULT_FILENAME }} | grep -E 'lines' | head -1) functions_cov=$(cat ${{ runner.temp }}/${{ env.COVERAGE_RESULT_FILENAME }} | grep -E 'functions' | head -1) branches_cov=$(cat ${{ runner.temp }}/${{ env.COVERAGE_RESULT_FILENAME }} | grep -E 'branches' | head -1) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c426d2101..a685e4f18 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -47,7 +47,7 @@ repos: entry: codespell args: [ - "--exclude-file=panther_hardware_interfaces/config/roboteq_motor_controllers_v80_21a.eds", + "--exclude-file=husarion_ugv_hardware_interfaces/config/roboteq_motor_controllers_v80_21a.eds", "--ignore-words-list", "ned" # north, east, down (NED) ] diff --git a/README.md b/README.md index 2732851c8..7abaf603e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# panther_ros +# husarion_ugv -ROS 2 packages for Panther autonomous mobile robot +ROS 2 packages for Husarion UGV (Unmanned Ground Vehicle). The repository is a collection of necessary packages enabling the launch of the Lynx and Panther robots. [![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit)](https://github.com/pre-commit/pre-commit) @@ -16,7 +16,7 @@ ROS 2 packages for Panther autonomous mobile robot ```bash mkdir ~/husarion_ws cd ~/husarion_ws -git clone -b ros2 https://github.com/husarion/panther_ros.git src/panther_ros +git clone -b ros2 https://github.com/husarion/panther_ros.git src/husarion_ugv ``` ### Configure environment @@ -38,7 +38,7 @@ export HUSARION_ROS_BUILD_TYPE=simulation ### Build ``` bash -vcs import src < src/panther_ros/panther/panther_$HUSARION_ROS_BUILD_TYPE.repos +vcs import src < src/husarion_ugv/husarion_ugv/${HUSARION_ROS_BUILD_TYPE}_deps.repos cp -r src/ros2_controllers/diff_drive_controller src cp -r src/ros2_controllers/imu_sensor_broadcaster src @@ -49,26 +49,26 @@ rosdep update --rosdistro $ROS_DISTRO rosdep install --from-paths src -y -i source /opt/ros/$ROS_DISTRO/setup.bash -colcon build --symlink-install --packages-up-to panther --cmake-args -DCMAKE_BUILD_TYPE=Release +colcon build --symlink-install --packages-up-to husarion_ugv --cmake-args -DCMAKE_BUILD_TYPE=Release source install/setup.bash ``` >[!NOTE] -> To build code on a real robot you need to run above commands on the Panther Built-in Computer. +> To build code on a real robot you need to run above commands on the robot Built-in Computer. ### Running Real robot: ```bash -ros2 launch panther_bringup bringup.launch.py +ros2 launch husarion_ugv_bringup bringup.launch.py ``` Simulation: ```bash -ros2 launch panther_gazebo simulation.launch.py +ros2 launch husarion_ugv_gazebo simulation.launch.py ``` > [!IMPORTANT] @@ -87,26 +87,26 @@ Launch arguments are largely common to both simulation and physical robot. Howev | --- | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 🖥️ | `add_wheel_joints` | Flag enabling joint_state_publisher to publish information about the wheel position. Should be false when there is a controller that sends this information.
***bool:*** `False` | | 🖥️ | `add_world_transform` | Adds a world frame that connects the tf trees of individual robots (useful when running multiple robots).
***bool:*** `False` | -| 🤖🖥️ | `animations_config_path` | Path to a YAML file with a description of led configuration. This file includes definition of robot panels, virtual segments and default animations.
***string:*** [`{robot_model}_animations.yaml`](./panther_lights/config) | +| 🤖🖥️ | `animations_config_path` | Path to a YAML file with a description of led configuration. This file includes definition of robot panels, virtual segments and default animations.
***string:*** [`{robot_model}_animations.yaml`](./husarion_ugv_lights/config) | | 🖥️ | `battery_config_path` | Path to the Ignition LinearBatteryPlugin configuration file. This configuration is intended for use in simulations only.
***string:*** `None` | -| 🤖🖥️ | `components_config_path` | Additional components configuration file. Components described in this file are dynamically included in Panther's urdf. Panther options are described in [the manual](https://husarion.com/manuals/panther/panther-options).
***string:*** [`components.yaml`](./panther_description/config/components.yaml) | -| 🤖🖥️ | `controller_config_path` | Path to controller configuration file. A path to custom configuration can be specified here.
***string:*** [`{wheel_type}_controller.yaml`](./panther_controller/config/) | +| 🤖🖥️ | `components_config_path` | Additional components configuration file. Components described in this file are dynamically included in robot's URDF. Available options are described in [the manual](https://husarion.com/manuals/panther/panther-options).
***string:*** [`components.yaml`](./panther_description/config/components.yaml) | +| 🤖🖥️ | `controller_config_path` | Path to controller configuration file. A path to custom configuration can be specified here.
***string:*** [`{wheel_type}_controller.yaml`](./husarion_ugv_controller/config/) | | 🤖 | `disable_manager` | Enable or disable manager_bt_node.
***bool:*** `False` | | 🤖🖥️ | `fuse_gps` | Include GPS for data fusion.
***bool:*** `False` | -| 🖥️ | `gz_bridge_config_path` | Path to the parameter_bridge configuration file.
***string:*** [`gz_bridge.yaml`](./panther_gazebo/config/gz_bridge.yaml) | +| 🖥️ | `gz_bridge_config_path` | Path to the parameter_bridge configuration file.
***string:*** [`gz_bridge.yaml`](./husarion_ugv_gazebo/config/gz_bridge.yaml) | | 🖥️ | `gz_gui` | Run simulation with specific GUI layout.
***string:*** [`teleop.config`](https://github.com/husarion/husarion_gz_worlds/blob/main/config/teleop.config) | | 🖥️ | `gz_headless_mode` | Run the simulation in headless mode. Useful when a GUI is not needed or to reduce the number of calculations.
***bool:*** `False` | | 🖥️ | `gz_log_level` | Adjust the level of console output.
***int:*** `1` (choices: `0`, `1`, `2`, `3`, `4`) | | 🖥️ | `gz_world` | Absolute path to SDF world file.
***string:*** [`husarion_world.sdf`](https://github.com/husarion/husarion_gz_worlds/blob/main/worlds/husarion_world.sdf) | | 🤖 | `launch_nmea_gps` | Whether to launch the NMEA NavSat driver node. Advisable when the robot is equipped with the [ANT02](https://husarion.com/manuals/panther/panther-options/#ant02---wi-fi--lte--gps).
***bool:*** `False` | -| 🤖🖥️ | `lights_bt_project_path` | Path to BehaviorTree project file, responsible for lights management.
***string:*** [`PantherLightsBT.btproj`](./panther_manager/behavior_trees/PantherLightsBT.btproj) | -| 🤖🖥️ | `localization_config_path` | Specify the path to the localization configuration file.
***string:*** [`relative_localization.yaml`](./panther_localization/config/relative_localization.yaml) | +| 🤖🖥️ | `lights_bt_project_path` | Path to BehaviorTree project file, responsible for lights management.
***string:*** [`PantherLightsBT.btproj`](./husarion_ugv_manager/behavior_trees/PantherLightsBT.btproj) | +| 🤖🖥️ | `localization_config_path` | Specify the path to the localization configuration file.
***string:*** [`relative_localization.yaml`](./husarion_ugv_localization/config/relative_localization.yaml) | | 🤖🖥️ | `localization_mode` | Specifies the localization mode:
- 'relative' `odometry/filtered` data is relative to the initial position and orientation.
- 'enu' `odometry/filtered` data is relative to initial position and ENU (East North Up) orientation.
***string:*** `relative` (choices: `relative`, `enu`) | | 🤖🖥️ | `namespace` | Add namespace to all launched nodes.
***string:*** `env(ROBOT_NAMESPACE)` | -| 🤖🖥️ | `publish_robot_state` | Whether to publish the default Panther robot description.
***bool:*** `True` | -| 🖥️ | `robot_model` | Specify robot model type.
***string:*** `env(ROBOT_MODEL)` if not specified `panther` (choices: `lynx`, `panther`) | -| 🤖🖥️ | `safety_bt_project_path` | Path to BehaviorTree project file, responsible for safety and shutdown management.
***string:*** [`PantherSafetyBT.btproj`](./panther_manager/behavior_trees/PantherSafetyBT.btproj) | -| 🤖🖥️ | `shutdown_hosts_config_path` | Path to file with list of hosts to request shutdown.
***string:*** [`shutdown_hosts.yaml`](./panther_manager/config/shutdown_hosts.yaml) | +| 🤖🖥️ | `publish_robot_state` | Whether to publish the default URDF of specified robot.
***bool:*** `True` | +| 🖥️ | `robot_model` | Specify robot model type.
***string:*** `env(ROBOT_MODEL)` (choices: `lynx`, `panther`) | +| 🤖🖥️ | `safety_bt_project_path` | Path to BehaviorTree project file, responsible for safety and shutdown management.
***string:*** [`PantherSafetyBT.btproj`](./husarion_ugv_manager/behavior_trees/PantherSafetyBT.btproj) | +| 🤖🖥️ | `shutdown_hosts_config_path` | Path to file with list of hosts to request shutdown.
***string:*** [`shutdown_hosts.yaml`](./husarion_ugv_manager/config/shutdown_hosts.yaml) | | 🤖🖥️ | `use_ekf` | Enable or disable EKF.
***bool:*** `True` | | 🤖🖥️ | `use_sim` | Whether simulation is used.
***bool:*** `False` | | 🤖🖥️ | `user_led_animations_path` | Path to a YAML file with a description of the user-defined animations.
***string:*** `''` | @@ -121,7 +121,7 @@ Launch arguments are largely common to both simulation and physical robot. Howev > [!TIP] > -> To read the arguments for individual packages, add the `-s` flag to the `ros2 launch` command (e.g. `ros2 launch panther_bringup bringup.launch.py ​​-s`) +> To read the arguments for individual packages, add the `-s` flag to the `ros2 launch` command (e.g. `ros2 launch husarion_ugv_bringup bringup.launch.py ​​-s`) ## Developer Info diff --git a/ROS_API.md b/ROS_API.md index e7fb79a60..322e025d4 100644 --- a/ROS_API.md +++ b/ROS_API.md @@ -3,7 +3,7 @@ > [!IMPORTANT] > **Beta Release** > -> Please be advised that the software you are about to use is a Beta version of the ROS 2 Driver for Panther. It is functional, and the architecture will not change significantly. Although it has been tested by the Husarion team, some stability issues and bugs may still occur. +> Please be advised that the software you are about to use is a Beta version of the ROS 2 Driver for Lynx and Panther. It is functional, and the architecture will not change significantly. Although it has been tested by the Husarion team, some stability issues and bugs may still occur. > > We would greatly appreciate your feedback regarding the Panther ROS 2 driver. You can reach us in the following ways: > @@ -13,20 +13,20 @@ ## ROS 2 System Design -This section describes the ROS packages in the Panther ROS system. These packages are located in the [panther_ros](https://github.com/husarion/panther_ros) GitHub repository. +This section describes the ROS packages used in Husarion UGV robots. These packages are located in the [panther_ros](https://github.com/husarion/panther_ros) GitHub repository. > [!NOTE] -> **Differences in ROS System** +> **Hardware Compatibility** > -> ROS 2 nodes differs slightly between **Panther v1.06** and **Panther v1.2+**. This is caused by internal hardware differences. Despite that, the ROS API was kept as closely matched between those revisions as possible and should be transparent in most of the use cases. +> This package supports **Lynx v0.2**, **Panther v1.2+**. This is caused by internal hardware differences. Despite that, the ROS API was kept as closely matched between those revisions as possible and should be transparent in most of the use cases. -The default way to communicate with Panther's hardware is via the Robot Operating System (ROS). All the drivers were written in ROS 2 framework. The ROS API is provided by ROS packages found in the GitHub repository [husarion/panther_ros](https://github.com/husarion/panther_ros). These packages are responsible for accessing the hardware components of the robot. +The default way to communicate with our robots is via the Robot Operating System (ROS). All the drivers were written in ROS 2 framework. The ROS API is provided by ROS packages found in the GitHub repository [husarion/panther_ros](https://github.com/husarion/panther_ros). These packages are responsible for accessing the hardware components of the robot. -The graph below represents Panther's ROS system. Some topics and services have been excluded from the graph for the sake of clarity. +The graph below represents Husarion UVG ROS system. Some topics and services have been excluded from the graph for the sake of clarity. -![Panther ROS 2 API Diagram](.docs/panther_ros2_api.drawio.svg) +![Husarion UVG ROS 2 System Design Diagram](.docs/ros2_system_design.drawio.svg) ## ROS Interfaces @@ -42,31 +42,31 @@ Below is information about the physical robot API. For the simulation, topics an | | Node name | Description | | --- | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 🤖 | `battery_driver` | Publishes battery state read from ADC unit for Panther version 1.2 and above, or based on Roboteq motor controllers' data for earlier versions of the robot.
[*panther_batter/battery_driver_node*](./panther_battery/include/panther_battery/battery_driver_node.hpp) | +| 🤖 | `battery_driver` | Publishes battery state read from ADC unit.
[*panther_batter/battery_driver_node*](./husarion_ugv_battery/include/husarion_ugv_battery/battery_driver_node.hpp) | | 🤖🖥️ | `controller_manager` | The Controller Manager performs two main functions. First, it manages controllers and their required interfaces, handling tasks like loading, activating, deactivating, and unloading. Second, it interacts with hardware components, ensuring access to their interfaces. This node manages the: `imu_broadcaster`, `joint_state_broadcaster`, `drive_controller`.
*[controller_manager/controller_manager](https://github.com/ros-controls/ros2_control/blob/master/controller_manager)* | | 🤖🖥️ | `drive_controller` | Manages mobile robots with a differential or mecanum drive depending on the configuration. It converts velocity commands for the robot body into wheel commands for the base. It also calculates odometry from hardware feedback and shares it.
*[diff_drive_controller/diff_drive_controller](https://github.com/ros-controls/ros2_controllers/tree/master/diff_drive_controller) or [mecanum_drive_controller/mecanum_drive_controller](https://github.com/husarion/husarion_controllers/tree/main/mecanum_drive_controller)* | | 🤖🖥️ | `ekf_filter` | The Extended Kalman Filter node is designed to fuse odometry data from various sources, including wheel encoders, IMU, and GPS.
*[robot_localization/ekf_filter](https://github.com/cra-ros-pkg/robot_localization)* | -| 🤖 | `hardware_controller` | Plugin responsible for communicating with engine controllers via the CAN bus and providing E-Stop functionalities.
*[panther_hardware_interfaces/PantherSystem](./panther_hardware_interfaces/src/panther_system/)* | +| 🤖 | `hardware_controller` | Plugin responsible for communicating with engine controllers via the CAN bus and providing E-Stop functionalities.
*[husarion_ugv_hardware_interfaces/{robot_model}System](./husarion_ugv_hardware_interfaces/src/panther_system/)* | | 🤖 | `gps` | Node responsible for parsing NMEA strings and publishing standard ROS NavSat message types.
*[nmea_navsat_driver/nmea_navsat_driver](https://github.com/ros-drivers/nmea_navsat_driver/tree/ros2/src/libnmea_navsat_driver)* | | 🖥️ | `gz_ros2_control` | Responsible for integrating the ros2_control controller architecture with the Gazebo simulator.
[gz_ros2_control/gz_ros2_control](https://github.com/ros-controls/gz_ros2_control/tree/master/gz_ros2_control/src) | -| 🖥️ | `gz_estop_gui` | The node is part of the Gazebo GUI plugin, enabling easy E-stop state modifications directly within the simulation.
[panther_gazebo/EStop](./panther_gazebo/src/gui/e_stop.cpp) | +| 🖥️ | `gz_estop_gui` | The node is part of the Gazebo GUI plugin, enabling easy E-stop state modifications directly within the simulation.
[husarion_ugv_gazebo/EStop](./husarion_ugv_gazebo/src/gui/e_stop.cpp) | | 🤖🖥️ | `imu_broadcaster` | Publishes readings of IMU sensors.
*[imu_sensor_broadcaster/imu_sensor_broadcaster](https://github.com/ros-controls/ros2_controllers/tree/master/imu_sensor_broadcaster)* | | 🤖🖥️ | `joint_state_broadcaster` | Reads all state interfaces and reports them on specific topics.
*[joint_state_broadcaster/joint_state_broadcaster](https://github.com/ros-controls/ros2_controllers/tree/master/joint_state_broadcaster)* | | 🤖🖥️ | `lights_container` | Node for managing ROS components. This node manages: `lights_controller`, `lights_driver`.
[*rclcpp_components/component_container*](https://github.com/ros2/rclcpp/tree/rolling/rclcpp_components) | -| 🤖🖥️ | `lights_controller` | This node is responsible for processing animations and publishing frames to be displayed on the Husarion Panther robot Bumper Lights.
[*panther_lights/LightsControllerNode*](./panther_lights/include/panther_lights/lights_controller_node.hpp) | -| 🤖 | `lights_driver` | This node is responsible for displaying frames on the Husarion Panther robot's Bumper Lights.
[*panther_lights/LightsDriverNode*](./panther_lights/include/panther_lights/lights_driver_node.hpp) | -| 🤖🖥️ | `lights_manager` | Node responsible for managing Bumper Lights animation scheduling.
[panther_manager/lights_manager](./panther_manager/include/panther_manager/lights_manager_node.hpp) | +| 🤖🖥️ | `lights_controller` | This node is responsible for processing animations and publishing frames to `light_driver` node.
[*husarion_ugv_lights/LightsControllerNode*](./husarion_ugv_lights/include/husarion_ugv_lights/lights_controller_node.hpp) | +| 🤖 | `lights_driver` | This node is responsible for displaying frames on the robot's lights.
[*husarion_ugv_lights/LightsDriverNode*](./husarion_ugv_lights/include/husarion_ugv_lights/lights_driver_node.hpp) | +| 🤖🖥️ | `lights_manager` | Node responsible for managing lights animation scheduling.
[husarion_ugv_manager/lights_manager](./husarion_ugv_manager/include/husarion_ugv_manager/lights_manager_node.hpp) | | 🤖🖥️⚙️ | `navsat_transform` | It converts raw GPS data into odometry data and publishes corrected GPS positions based on sensor data at a higher frequency.
*[robot_localization/navsat_transform](https://github.com/cra-ros-pkg/robot_localization)* | -| 🖥️ | `panther_base_gz_bridge` | Convert and transmit data between ROS and Gazebo
*[ros_gz_bridge/parameter_bridge](https://github.com/gazebosim/ros_gz/tree/ros2/ros_gz_bridge)* | +| 🖥️ | `base_gz_bridge` | Convert and transmit data between ROS and Gazebo
*[ros_gz_bridge/parameter_bridge](https://github.com/gazebosim/ros_gz/tree/ros2/ros_gz_bridge)* | | 🤖🖥️ | `robot_state_publisher` | Broadcasts a robot's state to tf2 using a provided URDF model and joint states. It updates the model and broadcasts poses for fixed and movable joints to tf2 topics.
*[robot_state_publisher/robot_state_publisher](https://github.com/ros/robot_state_publisher)* | -| 🤖 | `safety_manager` | Node responsible for managing safety features, and software shutdown of components.
*[panther_manager/safety_manager_node](./panther_manager/include/panther_manager/safety_manager_node.hpp)* | -| 🤖 | `system_monitor` | Publishes system state of the Built-in Computer such as CPU usage, RAM memory usage, disk usage and CPU temperature.
*[panther_diagnostic/system_monitor_node](./panther_diagnostics/include/panther_diagnostics/system_monitor_node.hpp)* | +| 🤖 | `safety_manager` | Node responsible for managing safety features, and software shutdown of components.
*[husarion_ugv_manager/safety_manager_node](./husarion_ugv_manager/include/husarion_ugv_manager/safety_manager_node.hpp)* | +| 🤖 | `system_monitor` | Publishes system state of the Built-in Computer such as CPU usage, RAM memory usage, disk usage and CPU temperature.
*[husarion_ugv_diagnostics/system_monitor_node](./husarion_ugv_diagnostics/include/husarion_ugv_diagnostics/system_monitor_node.hpp)* | ### Topics | | Topic | Description | | --- | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 🤖🖥️ | `battery/battery_status` | Mean values of both batteries if Panther has two batteries. Otherwise, the state of the single battery will be published.
[*sensor_msgs/BatteryState*](https://docs.ros2.org/latest/api/sensor_msgs/msg/BatteryState.html) | +| 🤖🖥️ | `battery/battery_status` | Mean values of both batteries will be published if the robot has two batteries. Otherwise, the state of the single battery will be published.
[*sensor_msgs/BatteryState*](https://docs.ros2.org/latest/api/sensor_msgs/msg/BatteryState.html) | | 🤖 | `battery/charging_status` | Battery charging status value.
[*panther_msgs/ChargingStatus*](https://github.com/husarion/panther_msgs) | | 🤖🖥️ | `cmd_vel` | Command velocity value.
[*geometry_msgs/Twist*](https://docs.ros2.org/latest/api/geometry_msgs/msg/Twist.html) | | 🤖🖥️ | `diagnostics` | Diagnostic data.
[*diagnostic_msgs/DiagnosticArray*](https://docs.ros2.org/latest/api/diagnostic_msgs/msg/DiagnosticArray.html) | diff --git a/panther/CHANGELOG.rst b/husarion_ugv/CHANGELOG.rst similarity index 100% rename from panther/CHANGELOG.rst rename to husarion_ugv/CHANGELOG.rst diff --git a/panther/CMakeLists.txt b/husarion_ugv/CMakeLists.txt similarity index 80% rename from panther/CMakeLists.txt rename to husarion_ugv/CMakeLists.txt index 626fc36ab..2c2d0e254 100644 --- a/panther/CMakeLists.txt +++ b/husarion_ugv/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.10.2) -project(panther) +project(husarion_ugv) find_package(ament_cmake REQUIRED) diff --git a/husarion_ugv/README.md b/husarion_ugv/README.md new file mode 100644 index 000000000..bc079c16b --- /dev/null +++ b/husarion_ugv/README.md @@ -0,0 +1,3 @@ +# husarion_ugv + +ROS 2 Metapackage composing basic functionalities of the Husarion UGV robot with VCS Tool yaml files directing to external robot dependencies. diff --git a/panther/panther_hardware.repos b/husarion_ugv/hardware_deps.repos similarity index 100% rename from panther/panther_hardware.repos rename to husarion_ugv/hardware_deps.repos diff --git a/panther/package.xml b/husarion_ugv/package.xml similarity index 71% rename from panther/package.xml rename to husarion_ugv/package.xml index f849f5671..e426e3876 100644 --- a/panther/package.xml +++ b/husarion_ugv/package.xml @@ -1,9 +1,9 @@ - panther + husarion_ugv 2.1.1 - Meta package that contains all packages of Panther + Meta package that contains all packages of Husarion UGV (Unmanned Ground Vehicle) Husarion Apache License 2.0 @@ -15,8 +15,8 @@ ament_cmake - panther_bringup - panther_gazebo + husarion_ugv_bringup + husarion_ugv_gazebo ament_cmake diff --git a/panther/panther_simulation.repos b/husarion_ugv/simulation_deps.repos similarity index 100% rename from panther/panther_simulation.repos rename to husarion_ugv/simulation_deps.repos diff --git a/panther_battery/CHANGELOG.rst b/husarion_ugv_battery/CHANGELOG.rst similarity index 100% rename from panther_battery/CHANGELOG.rst rename to husarion_ugv_battery/CHANGELOG.rst diff --git a/panther_battery/CMakeLists.txt b/husarion_ugv_battery/CMakeLists.txt similarity index 97% rename from panther_battery/CMakeLists.txt rename to husarion_ugv_battery/CMakeLists.txt index 4e12bab87..d928de579 100644 --- a/panther_battery/CMakeLists.txt +++ b/husarion_ugv_battery/CMakeLists.txt @@ -1,18 +1,18 @@ cmake_minimum_required(VERSION 3.10.2) -project(panther_battery) +project(husarion_ugv_battery) if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options(-Wall -Wextra -Wpedantic) endif() set(PACKAGE_DEPENDENCIES ament_cmake diagnostic_updater panther_msgs - panther_utils rclcpp sensor_msgs) + husarion_ugv_utils rclcpp sensor_msgs) foreach(PACKAGE IN ITEMS ${PACKAGE_DEPENDENCIES}) find_package(${PACKAGE} REQUIRED) endforeach() -include_directories(include ${panther_utils_INCLUDE_DIRS}) +include_directories(include ${husarion_ugv_utils_INCLUDE_DIRS}) add_executable( battery_driver_node diff --git a/panther_battery/README.md b/husarion_ugv_battery/README.md similarity index 75% rename from panther_battery/README.md rename to husarion_ugv_battery/README.md index d591938d3..1e2e0b846 100644 --- a/panther_battery/README.md +++ b/husarion_ugv_battery/README.md @@ -1,6 +1,6 @@ -# panther_battery +# husarion_ugv_battery -The package containing nodes monitoring and publishing the internal battery state of the Husarion Panther robot. +The package containing nodes monitoring and publishing the internal battery state of the Husarion UGV robots. ## Launch Files @@ -12,13 +12,13 @@ This package contains: ### battery_driver_node -Publishes battery state read from ADC unit for Panther version 1.2 and above, or based on Roboteq motor controllers' data for earlier.versions of the robot. +Publishes battery state read from ADC unit. #### Publishes - `_battery/battery_1_status_raw` [*sensor_msgs/BatteryState*]: First battery raw state. - `_battery/battery_2_status_raw` [*sensor_msgs/BatteryState*]: Second battery raw state. Published if second battery detected. -- `battery/battery_status` [*sensor_msgs/BatteryState*]: Mean values of both batteries if Panther has two batteries. Otherwise, the state of the single battery will be published. +- `battery/battery_status` [*sensor_msgs/BatteryState*]: Mean values of both batteries if robot has two batteries. Otherwise, the state of the single battery will be published. - `battery/charging_status` [*panther_msgs/ChargingStatus*]: Battery charging status. - `diagnostics` [*diagnostic_msgs/DiagnosticArray*]: Battery diagnostic messages. @@ -29,11 +29,11 @@ Publishes battery state read from ADC unit for Panther version 1.2 and above, or #### Parameters -- `~/adc/device0` [*string*, default: **/sys/bus/iio/devices/iio:device0**]: ADC nr 0 IIO device. Used with Panther version 1.2 and above. -- `~/adc/device1` [*string*, default: **/sys/bus/iio/devices/iio:device1**]: ADC nr 1 IIO device. Used with Panther version 1.2 and above. -- `~/adc/ma_window_len/charge` [*int*, default: **10**]: Window length of a moving average, used to smooth out battery charge readings. Used with Panther version 1.2 and above. -- `~/adc/ma_window_len/temp` [*int*, default: **10**]: Window length of a moving average, used to smooth out battery temperature readings. Used with Panther version 1.2 and above. +- `~/adc/device0` [*string*, default: **/sys/bus/iio/devices/iio:device0**]: ADC number 0 IIO device. +- `~/adc/device1` [*string*, default: **/sys/bus/iio/devices/iio:device1**]: ADC number 1 IIO device. +- `~/adc/ma_window_len/charge` [*int*, default: **10**]: Window length of a moving average, used to smooth out battery charge readings. +- `~/adc/ma_window_len/temp` [*int*, default: **10**]: Window length of a moving average, used to smooth out battery temperature readings. - `~/battery_timeout` [*float*, default: **1.0**]: Specifies the timeout in seconds. If the node fails to read battery data exceeding this duration, the node will publish an unknown battery state. - `~/ma_window_len/voltage` [*int*, default: **10**]: Window length of a moving average, used to smooth out battery voltage readings. - `~/ma_window_len/current` [*int*, default: **10**]: Window length of a moving average, used to smooth out battery current readings. -- `~/roboteq/driver_state_timeout` [*float*, default: **0.2**]: Specifies timeout in seconds after which driver state messages will be considered old. Used with Panther version 1.06 and earlier. +- `~/roboteq/driver_state_timeout` [*float*, default: **0.2**]: Specifies timeout in seconds after which driver state messages will be considered old (deprecated). diff --git a/panther_battery/include/panther_battery/adc_data_reader.hpp b/husarion_ugv_battery/include/husarion_ugv_battery/adc_data_reader.hpp similarity index 90% rename from panther_battery/include/panther_battery/adc_data_reader.hpp rename to husarion_ugv_battery/include/husarion_ugv_battery/adc_data_reader.hpp index 08dca0d00..59e1fb57e 100644 --- a/panther_battery/include/panther_battery/adc_data_reader.hpp +++ b/husarion_ugv_battery/include/husarion_ugv_battery/adc_data_reader.hpp @@ -12,15 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_BATTERY_ADC_DATA_READER_HPP_ -#define PANTHER_BATTERY_ADC_DATA_READER_HPP_ +#ifndef HUSARION_UGV_BATTERY_ADC_DATA_READER_HPP_ +#define HUSARION_UGV_BATTERY_ADC_DATA_READER_HPP_ #include #include #include #include -namespace panther_battery +namespace husarion_ugv_battery { class ADCDataReader @@ -75,6 +75,6 @@ class ADCDataReader const std::filesystem::path device_path_; }; -} // namespace panther_battery +} // namespace husarion_ugv_battery -#endif // PANTHER_BATTERY_ADC_DATA_READER_HPP_ +#endif // HUSARION_UGV_BATTERY_ADC_DATA_READER_HPP_ diff --git a/panther_battery/include/panther_battery/battery/adc_battery.hpp b/husarion_ugv_battery/include/husarion_ugv_battery/battery/adc_battery.hpp similarity index 83% rename from panther_battery/include/panther_battery/battery/adc_battery.hpp rename to husarion_ugv_battery/include/husarion_ugv_battery/battery/adc_battery.hpp index 6aebfa097..94dd428d4 100644 --- a/panther_battery/include/panther_battery/battery/adc_battery.hpp +++ b/husarion_ugv_battery/include/husarion_ugv_battery/battery/adc_battery.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_BATTERY_BATTERY_ADC_BATTERY_HPP_ -#define PANTHER_BATTERY_BATTERY_ADC_BATTERY_HPP_ +#ifndef HUSARION_UGV_BATTERY_BATTERY_ADC_BATTERY_HPP_ +#define HUSARION_UGV_BATTERY_BATTERY_ADC_BATTERY_HPP_ #include #include @@ -21,10 +21,10 @@ #include "rclcpp/rclcpp.hpp" -#include "panther_battery/battery/battery.hpp" -#include "panther_utils/moving_average.hpp" +#include "husarion_ugv_battery/battery/battery.hpp" +#include "husarion_ugv_utils/moving_average.hpp" -namespace panther_battery +namespace husarion_ugv_battery { using BatteryStateMsg = sensor_msgs::msg::BatteryState; @@ -89,12 +89,12 @@ class ADCBattery : public Battery const std::function ReadTemp; const std::function ReadCharge; - std::unique_ptr> voltage_ma_; - std::unique_ptr> current_ma_; - std::unique_ptr> temp_ma_; - std::unique_ptr> charge_ma_; + std::unique_ptr> voltage_ma_; + std::unique_ptr> current_ma_; + std::unique_ptr> temp_ma_; + std::unique_ptr> charge_ma_; }; -} // namespace panther_battery +} // namespace husarion_ugv_battery -#endif // PANTHER_BATTERY_BATTERY_ADC_BATTERY_HPP_ +#endif // HUSARION_UGV_BATTERY_BATTERY_ADC_BATTERY_HPP_ diff --git a/panther_battery/include/panther_battery/battery/battery.hpp b/husarion_ugv_battery/include/husarion_ugv_battery/battery/battery.hpp similarity index 95% rename from panther_battery/include/panther_battery/battery/battery.hpp rename to husarion_ugv_battery/include/husarion_ugv_battery/battery/battery.hpp index eb067aa61..7e461cfa4 100644 --- a/panther_battery/include/panther_battery/battery/battery.hpp +++ b/husarion_ugv_battery/include/husarion_ugv_battery/battery/battery.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_BATTERY_BATTERY_BATTERY_HPP_ -#define PANTHER_BATTERY_BATTERY_BATTERY_HPP_ +#ifndef HUSARION_UGV_BATTERY_BATTERY_BATTERY_HPP_ +#define HUSARION_UGV_BATTERY_BATTERY_BATTERY_HPP_ #include #include @@ -27,7 +27,7 @@ #include "panther_msgs/msg/charging_status.hpp" -namespace panther_battery +namespace husarion_ugv_battery { using BatteryStateMsg = sensor_msgs::msg::BatteryState; @@ -127,6 +127,6 @@ class Battery ChargingStatusMsg charging_status_; }; -} // namespace panther_battery +} // namespace husarion_ugv_battery -#endif // PANTHER_BATTERY_BATTERY_BATTERY_HPP_ +#endif // HUSARION_UGV_BATTERY_BATTERY_BATTERY_HPP_ diff --git a/panther_battery/include/panther_battery/battery/roboteq_battery.hpp b/husarion_ugv_battery/include/husarion_ugv_battery/battery/roboteq_battery.hpp similarity index 81% rename from panther_battery/include/panther_battery/battery/roboteq_battery.hpp rename to husarion_ugv_battery/include/husarion_ugv_battery/battery/roboteq_battery.hpp index 34d1d3cdd..0b785f79f 100644 --- a/panther_battery/include/panther_battery/battery/roboteq_battery.hpp +++ b/husarion_ugv_battery/include/husarion_ugv_battery/battery/roboteq_battery.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_BATTERY_BATTERY_ROBOTEQ_BATTERY_HPP_ -#define PANTHER_BATTERY_BATTERY_ROBOTEQ_BATTERY_HPP_ +#ifndef HUSARION_UGV_BATTERY_BATTERY_ROBOTEQ_BATTERY_HPP_ +#define HUSARION_UGV_BATTERY_BATTERY_ROBOTEQ_BATTERY_HPP_ #include #include @@ -24,10 +24,10 @@ #include "panther_msgs/msg/driver_state_named.hpp" #include "panther_msgs/msg/robot_driver_state.hpp" -#include "panther_battery/battery/battery.hpp" -#include "panther_utils/moving_average.hpp" +#include "husarion_ugv_battery/battery/battery.hpp" +#include "husarion_ugv_utils/moving_average.hpp" -namespace panther_battery +namespace husarion_ugv_battery { using RobotDriverStateMsg = panther_msgs::msg::RobotDriverState; @@ -73,10 +73,10 @@ class RoboteqBattery : public Battery float current_raw_; RobotDriverStateMsg::SharedPtr driver_state_; - std::unique_ptr> voltage_ma_; - std::unique_ptr> current_ma_; + std::unique_ptr> voltage_ma_; + std::unique_ptr> current_ma_; }; -} // namespace panther_battery +} // namespace husarion_ugv_battery -#endif // PANTHER_BATTERY_BATTERY_ROBOTEQ_BATTERY_HPP_ +#endif // HUSARION_UGV_BATTERY_BATTERY_ROBOTEQ_BATTERY_HPP_ diff --git a/panther_battery/include/panther_battery/battery_driver_node.hpp b/husarion_ugv_battery/include/husarion_ugv_battery/battery_driver_node.hpp similarity index 80% rename from panther_battery/include/panther_battery/battery_driver_node.hpp rename to husarion_ugv_battery/include/husarion_ugv_battery/battery_driver_node.hpp index 0832bc038..1bba8b993 100644 --- a/panther_battery/include/panther_battery/battery_driver_node.hpp +++ b/husarion_ugv_battery/include/husarion_ugv_battery/battery_driver_node.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_BATTERY_BATTERY_DRIVER_NODE_HPP_ -#define PANTHER_BATTERY_BATTERY_DRIVER_NODE_HPP_ +#ifndef HUSARION_UGV_BATTERY_BATTERY_DRIVER_NODE_HPP_ +#define HUSARION_UGV_BATTERY_BATTERY_DRIVER_NODE_HPP_ #include #include @@ -23,11 +23,11 @@ #include "panther_msgs/msg/robot_driver_state.hpp" -#include "panther_battery/adc_data_reader.hpp" -#include "panther_battery/battery/battery.hpp" -#include "panther_battery/battery_publisher/battery_publisher.hpp" +#include "husarion_ugv_battery/adc_data_reader.hpp" +#include "husarion_ugv_battery/battery/battery.hpp" +#include "husarion_ugv_battery/battery_publisher/battery_publisher.hpp" -namespace panther_battery +namespace husarion_ugv_battery { using RobotDriverStateMsg = panther_msgs::msg::RobotDriverState; @@ -60,6 +60,6 @@ class BatteryDriverNode : public rclcpp::Node std::shared_ptr diagnostic_updater_; }; -} // namespace panther_battery +} // namespace husarion_ugv_battery -#endif // PANTHER_BATTERY_BATTERY_DRIVER_NODE_HPP_ +#endif // HUSARION_UGV_BATTERY_BATTERY_DRIVER_NODE_HPP_ diff --git a/panther_battery/include/panther_battery/battery_publisher/battery_publisher.hpp b/husarion_ugv_battery/include/husarion_ugv_battery/battery_publisher/battery_publisher.hpp similarity index 88% rename from panther_battery/include/panther_battery/battery_publisher/battery_publisher.hpp rename to husarion_ugv_battery/include/husarion_ugv_battery/battery_publisher/battery_publisher.hpp index 688f1899c..9258b9a51 100644 --- a/panther_battery/include/panther_battery/battery_publisher/battery_publisher.hpp +++ b/husarion_ugv_battery/include/husarion_ugv_battery/battery_publisher/battery_publisher.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_BATTERY_BATTERY_PUBLISHER_BATTERY_PUBLISHER_HPP_ -#define PANTHER_BATTERY_BATTERY_PUBLISHER_BATTERY_PUBLISHER_HPP_ +#ifndef HUSARION_UGV_BATTERY_BATTERY_PUBLISHER_BATTERY_PUBLISHER_HPP_ +#define HUSARION_UGV_BATTERY_BATTERY_PUBLISHER_BATTERY_PUBLISHER_HPP_ #include @@ -25,7 +25,7 @@ #include "panther_msgs/msg/charging_status.hpp" #include "panther_msgs/msg/io_state.hpp" -namespace panther_battery +namespace husarion_ugv_battery { using BatteryStateMsg = sensor_msgs::msg::BatteryState; @@ -71,6 +71,6 @@ class BatteryPublisher rclcpp::Subscription::SharedPtr io_state_sub_; }; -} // namespace panther_battery +} // namespace husarion_ugv_battery -#endif // PANTHER_BATTERY_BATTERY_PUBLISHER_BATTERY_PUBLISHER_HPP_ +#endif // HUSARION_UGV_BATTERY_BATTERY_PUBLISHER_BATTERY_PUBLISHER_HPP_ diff --git a/panther_battery/include/panther_battery/battery_publisher/dual_battery_publisher.hpp b/husarion_ugv_battery/include/husarion_ugv_battery/battery_publisher/dual_battery_publisher.hpp similarity index 84% rename from panther_battery/include/panther_battery/battery_publisher/dual_battery_publisher.hpp rename to husarion_ugv_battery/include/husarion_ugv_battery/battery_publisher/dual_battery_publisher.hpp index 9890465fb..738d7766e 100644 --- a/panther_battery/include/panther_battery/battery_publisher/dual_battery_publisher.hpp +++ b/husarion_ugv_battery/include/husarion_ugv_battery/battery_publisher/dual_battery_publisher.hpp @@ -12,18 +12,18 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_BATTERY_BATTERY_PUBLISHER_DUAL_BATTERY_PUBLISHER_HPP_ -#define PANTHER_BATTERY_BATTERY_PUBLISHER_DUAL_BATTERY_PUBLISHER_HPP_ +#ifndef HUSARION_UGV_BATTERY_BATTERY_PUBLISHER_DUAL_BATTERY_PUBLISHER_HPP_ +#define HUSARION_UGV_BATTERY_BATTERY_PUBLISHER_DUAL_BATTERY_PUBLISHER_HPP_ #include #include #include "rclcpp/rclcpp.hpp" -#include "panther_battery/battery/battery.hpp" -#include "panther_battery/battery_publisher/battery_publisher.hpp" +#include "husarion_ugv_battery/battery/battery.hpp" +#include "husarion_ugv_battery/battery_publisher/battery_publisher.hpp" -namespace panther_battery +namespace husarion_ugv_battery { class DualBatteryPublisher : public BatteryPublisher @@ -66,6 +66,6 @@ class DualBatteryPublisher : public BatteryPublisher rclcpp::Publisher::SharedPtr charging_status_pub_; }; -} // namespace panther_battery +} // namespace husarion_ugv_battery -#endif // PANTHER_BATTERY_BATTERY_PUBLISHER_DUAL_BATTERY_PUBLISHER_HPP_ +#endif // HUSARION_UGV_BATTERY_BATTERY_PUBLISHER_DUAL_BATTERY_PUBLISHER_HPP_ diff --git a/panther_battery/include/panther_battery/battery_publisher/single_battery_publisher.hpp b/husarion_ugv_battery/include/husarion_ugv_battery/battery_publisher/single_battery_publisher.hpp similarity index 78% rename from panther_battery/include/panther_battery/battery_publisher/single_battery_publisher.hpp rename to husarion_ugv_battery/include/husarion_ugv_battery/battery_publisher/single_battery_publisher.hpp index 29be9bc5c..f1e65ecfe 100644 --- a/panther_battery/include/panther_battery/battery_publisher/single_battery_publisher.hpp +++ b/husarion_ugv_battery/include/husarion_ugv_battery/battery_publisher/single_battery_publisher.hpp @@ -12,17 +12,17 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_BATTERY_BATTERY_PUBLISHER_SINGLE_BATTERY_PUBLISHER_HPP_ -#define PANTHER_BATTERY_BATTERY_PUBLISHER_SINGLE_BATTERY_PUBLISHER_HPP_ +#ifndef HUSARION_UGV_BATTERY_BATTERY_PUBLISHER_SINGLE_BATTERY_PUBLISHER_HPP_ +#define HUSARION_UGV_BATTERY_BATTERY_PUBLISHER_SINGLE_BATTERY_PUBLISHER_HPP_ #include #include "rclcpp/rclcpp.hpp" -#include "panther_battery/battery/battery.hpp" -#include "panther_battery/battery_publisher/battery_publisher.hpp" +#include "husarion_ugv_battery/battery/battery.hpp" +#include "husarion_ugv_battery/battery_publisher/battery_publisher.hpp" -namespace panther_battery +namespace husarion_ugv_battery { class SingleBatteryPublisher : public BatteryPublisher @@ -51,6 +51,6 @@ class SingleBatteryPublisher : public BatteryPublisher rclcpp::Publisher::SharedPtr charging_status_pub_; }; -} // namespace panther_battery +} // namespace husarion_ugv_battery -#endif // PANTHER_BATTERY_BATTERY_PUBLISHER_SINGLE_BATTERY_PUBLISHER_HPP_ +#endif // HUSARION_UGV_BATTERY_BATTERY_PUBLISHER_SINGLE_BATTERY_PUBLISHER_HPP_ diff --git a/panther_battery/launch/battery.launch.py b/husarion_ugv_battery/launch/battery.launch.py similarity index 97% rename from panther_battery/launch/battery.launch.py rename to husarion_ugv_battery/launch/battery.launch.py index 51139e50e..d8327e332 100644 --- a/panther_battery/launch/battery.launch.py +++ b/husarion_ugv_battery/launch/battery.launch.py @@ -29,7 +29,7 @@ def generate_launch_description(): ) battery_driver_node = Node( - package="panther_battery", + package="husarion_ugv_battery", executable="battery_driver_node", name="battery_driver", namespace=namespace, diff --git a/panther_battery/package.xml b/husarion_ugv_battery/package.xml similarity index 93% rename from panther_battery/package.xml rename to husarion_ugv_battery/package.xml index 8e67a1b9b..70f025d7e 100644 --- a/panther_battery/package.xml +++ b/husarion_ugv_battery/package.xml @@ -1,7 +1,7 @@ - panther_battery + husarion_ugv_battery 2.1.1 Nodes monitoring the battery state of Husarion Panhter robot Husarion @@ -17,8 +17,8 @@ ament_cmake diagnostic_updater + husarion_ugv_utils panther_msgs - panther_utils rclcpp sensor_msgs diff --git a/panther_battery/src/battery/adc_battery.cpp b/husarion_ugv_battery/src/battery/adc_battery.cpp similarity index 93% rename from panther_battery/src/battery/adc_battery.cpp rename to husarion_ugv_battery/src/battery/adc_battery.cpp index 968f48236..cd13f25a0 100644 --- a/panther_battery/src/battery/adc_battery.cpp +++ b/husarion_ugv_battery/src/battery/adc_battery.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_battery/battery/adc_battery.hpp" +#include "husarion_ugv_battery/battery/adc_battery.hpp" #include #include @@ -24,9 +24,9 @@ #include "rclcpp/rclcpp.hpp" -#include "panther_utils/moving_average.hpp" +#include "husarion_ugv_utils/moving_average.hpp" -namespace panther_battery +namespace husarion_ugv_battery { ADCBattery::ADCBattery( @@ -35,13 +35,13 @@ ADCBattery::ADCBattery( const ADCBatteryParams & params) : ReadVoltage(read_voltage), ReadCurrent(read_current), ReadTemp(read_temp), ReadCharge(read_charge) { - voltage_ma_ = std::make_unique>( + voltage_ma_ = std::make_unique>( params.voltage_window_len, std::numeric_limits::quiet_NaN()); - current_ma_ = std::make_unique>( + current_ma_ = std::make_unique>( params.current_window_len, std::numeric_limits::quiet_NaN()); - temp_ma_ = std::make_unique>( + temp_ma_ = std::make_unique>( params.temp_window_len, std::numeric_limits::quiet_NaN()); - charge_ma_ = std::make_unique>( + charge_ma_ = std::make_unique>( params.charge_window_len, std::numeric_limits::quiet_NaN()); } @@ -197,4 +197,4 @@ std::uint8_t ADCBattery::GetBatteryHealth(const float voltage, const float temp) } } -} // namespace panther_battery +} // namespace husarion_ugv_battery diff --git a/panther_battery/src/battery/roboteq_battery.cpp b/husarion_ugv_battery/src/battery/roboteq_battery.cpp similarity index 94% rename from panther_battery/src/battery/roboteq_battery.cpp rename to husarion_ugv_battery/src/battery/roboteq_battery.cpp index 6cd0f3fde..7d2d870d4 100644 --- a/panther_battery/src/battery/roboteq_battery.cpp +++ b/husarion_ugv_battery/src/battery/roboteq_battery.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_battery/battery/roboteq_battery.hpp" +#include "husarion_ugv_battery/battery/roboteq_battery.hpp" #include #include @@ -23,9 +23,9 @@ #include "rclcpp/rclcpp.hpp" -#include "panther_utils/moving_average.hpp" +#include "husarion_ugv_utils/moving_average.hpp" -namespace panther_battery +namespace husarion_ugv_battery { RoboteqBattery::RoboteqBattery( @@ -33,9 +33,9 @@ RoboteqBattery::RoboteqBattery( const RoboteqBatteryParams & params) : GetRobotDriverState(get_driver_state), driver_state_timeout_(params.driver_state_timeout) { - voltage_ma_ = std::make_unique>( + voltage_ma_ = std::make_unique>( params.voltage_window_len, std::numeric_limits::quiet_NaN()); - current_ma_ = std::make_unique>( + current_ma_ = std::make_unique>( params.current_window_len, std::numeric_limits::quiet_NaN()); } @@ -157,4 +157,4 @@ bool RoboteqBattery::DriverStateHeartbeatTimeout() [](const DriverStateNamedMsg & driver) { return driver.state.heartbeat_timeout; }); } -} // namespace panther_battery +} // namespace husarion_ugv_battery diff --git a/panther_battery/src/battery_driver_node.cpp b/husarion_ugv_battery/src/battery_driver_node.cpp similarity index 91% rename from panther_battery/src/battery_driver_node.cpp rename to husarion_ugv_battery/src/battery_driver_node.cpp index f3603b87a..9ec166652 100644 --- a/panther_battery/src/battery_driver_node.cpp +++ b/husarion_ugv_battery/src/battery_driver_node.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_battery/battery_driver_node.hpp" +#include "husarion_ugv_battery/battery_driver_node.hpp" #include #include @@ -24,15 +24,15 @@ #include "diagnostic_updater/diagnostic_updater.hpp" #include "rclcpp/rclcpp.hpp" -#include "panther_battery/adc_data_reader.hpp" -#include "panther_battery/battery/adc_battery.hpp" -#include "panther_battery/battery/battery.hpp" -#include "panther_battery/battery/roboteq_battery.hpp" -#include "panther_battery/battery_publisher/battery_publisher.hpp" -#include "panther_battery/battery_publisher/dual_battery_publisher.hpp" -#include "panther_battery/battery_publisher/single_battery_publisher.hpp" +#include "husarion_ugv_battery/adc_data_reader.hpp" +#include "husarion_ugv_battery/battery/adc_battery.hpp" +#include "husarion_ugv_battery/battery/battery.hpp" +#include "husarion_ugv_battery/battery/roboteq_battery.hpp" +#include "husarion_ugv_battery/battery_publisher/battery_publisher.hpp" +#include "husarion_ugv_battery/battery_publisher/dual_battery_publisher.hpp" +#include "husarion_ugv_battery/battery_publisher/single_battery_publisher.hpp" -namespace panther_battery +namespace husarion_ugv_battery { BatteryDriverNode::BatteryDriverNode( @@ -157,4 +157,4 @@ void BatteryDriverNode::BatteryPubTimerCB() battery_publisher_->Publish(); } -} // namespace panther_battery +} // namespace husarion_ugv_battery diff --git a/panther_battery/src/battery_publisher/battery_publisher.cpp b/husarion_ugv_battery/src/battery_publisher/battery_publisher.cpp similarity index 96% rename from panther_battery/src/battery_publisher/battery_publisher.cpp rename to husarion_ugv_battery/src/battery_publisher/battery_publisher.cpp index e3ccb14b8..e37fcbfe4 100644 --- a/panther_battery/src/battery_publisher/battery_publisher.cpp +++ b/husarion_ugv_battery/src/battery_publisher/battery_publisher.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_battery/battery_publisher/battery_publisher.hpp" +#include "husarion_ugv_battery/battery_publisher/battery_publisher.hpp" #include #include @@ -21,7 +21,7 @@ #include "diagnostic_updater/diagnostic_updater.hpp" #include "rclcpp/rclcpp.hpp" -namespace panther_battery +namespace husarion_ugv_battery { BatteryPublisher::BatteryPublisher( @@ -140,4 +140,4 @@ rclcpp::Clock::SharedPtr BatteryPublisher::GetClock() return std::make_shared(RCL_ROS_TIME); } -} // namespace panther_battery +} // namespace husarion_ugv_battery diff --git a/panther_battery/src/battery_publisher/dual_battery_publisher.cpp b/husarion_ugv_battery/src/battery_publisher/dual_battery_publisher.cpp similarity index 96% rename from panther_battery/src/battery_publisher/dual_battery_publisher.cpp rename to husarion_ugv_battery/src/battery_publisher/dual_battery_publisher.cpp index fba8198d2..f474b1fe7 100644 --- a/panther_battery/src/battery_publisher/dual_battery_publisher.cpp +++ b/husarion_ugv_battery/src/battery_publisher/dual_battery_publisher.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_battery/battery_publisher/dual_battery_publisher.hpp" +#include "husarion_ugv_battery/battery_publisher/dual_battery_publisher.hpp" #include #include @@ -24,11 +24,11 @@ #include "sensor_msgs/msg/battery_state.hpp" -#include "panther_battery/battery/battery.hpp" -#include "panther_battery/battery_publisher/battery_publisher.hpp" -#include "panther_utils/ros_utils.hpp" +#include "husarion_ugv_battery/battery/battery.hpp" +#include "husarion_ugv_battery/battery_publisher/battery_publisher.hpp" +#include "husarion_ugv_utils/ros_utils.hpp" -namespace panther_battery +namespace husarion_ugv_battery { DualBatteryPublisher::DualBatteryPublisher( @@ -172,10 +172,10 @@ ChargingStatusMsg DualBatteryPublisher::MergeChargingStatusMsgs( ChargingStatusMsg charging_status_msg; try { - panther_utils::ros::VerifyTimestampGap( + husarion_ugv_utils::ros::VerifyTimestampGap( charging_status_msg_1.header, charging_status_msg_2.header, std::chrono::seconds(1)); - charging_status_msg.header = panther_utils::ros::MergeHeaders( + charging_status_msg.header = husarion_ugv_utils::ros::MergeHeaders( charging_status_msg_1.header, charging_status_msg_2.header); } catch (const std::exception & e) { RCLCPP_ERROR_STREAM_THROTTLE( @@ -251,4 +251,4 @@ void DualBatteryPublisher::DiagnoseStatus(diagnostic_updater::DiagnosticStatusWr status.summary(diagnostic_updater::DiagnosticStatusWrapper::OK, "Battery status monitoring"); } -} // namespace panther_battery +} // namespace husarion_ugv_battery diff --git a/panther_battery/src/battery_publisher/single_battery_publisher.cpp b/husarion_ugv_battery/src/battery_publisher/single_battery_publisher.cpp similarity index 92% rename from panther_battery/src/battery_publisher/single_battery_publisher.cpp rename to husarion_ugv_battery/src/battery_publisher/single_battery_publisher.cpp index 4916e647c..92e4d0031 100644 --- a/panther_battery/src/battery_publisher/single_battery_publisher.cpp +++ b/husarion_ugv_battery/src/battery_publisher/single_battery_publisher.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_battery/battery_publisher/single_battery_publisher.hpp" +#include "husarion_ugv_battery/battery_publisher/single_battery_publisher.hpp" #include #include @@ -23,10 +23,10 @@ #include "sensor_msgs/msg/battery_state.hpp" -#include "panther_battery/battery/battery.hpp" -#include "panther_battery/battery_publisher/battery_publisher.hpp" +#include "husarion_ugv_battery/battery/battery.hpp" +#include "husarion_ugv_battery/battery_publisher/battery_publisher.hpp" -namespace panther_battery +namespace husarion_ugv_battery { SingleBatteryPublisher::SingleBatteryPublisher( @@ -106,4 +106,4 @@ void SingleBatteryPublisher::DiagnoseStatus(diagnostic_updater::DiagnosticStatus status.summary(diagnostic_updater::DiagnosticStatusWrapper::OK, "Battery status monitoring"); } -} // namespace panther_battery +} // namespace husarion_ugv_battery diff --git a/panther_battery/src/main.cpp b/husarion_ugv_battery/src/main.cpp similarity index 86% rename from panther_battery/src/main.cpp rename to husarion_ugv_battery/src/main.cpp index b759fd33a..9dc84ddfd 100644 --- a/panther_battery/src/main.cpp +++ b/husarion_ugv_battery/src/main.cpp @@ -18,13 +18,14 @@ #include "rclcpp/rclcpp.hpp" -#include "panther_battery/battery_driver_node.hpp" +#include "husarion_ugv_battery/battery_driver_node.hpp" int main(int argc, char ** argv) { rclcpp::init(argc, argv); - auto battery_driver_node = std::make_shared("battery_driver"); + auto battery_driver_node = + std::make_shared("battery_driver"); try { rclcpp::spin(battery_driver_node); diff --git a/panther_battery/test/battery/test_adc_battery.cpp b/husarion_ugv_battery/test/battery/test_adc_battery.cpp similarity index 93% rename from panther_battery/test/battery/test_adc_battery.cpp rename to husarion_ugv_battery/test/battery/test_adc_battery.cpp index 986f7cdb1..9486c85ef 100644 --- a/panther_battery/test/battery/test_adc_battery.cpp +++ b/husarion_ugv_battery/test/battery/test_adc_battery.cpp @@ -24,8 +24,8 @@ #include "panther_msgs/msg/charging_status.hpp" -#include "panther_battery/battery/adc_battery.hpp" -#include "panther_utils/test/test_utils.hpp" +#include "husarion_ugv_battery/battery/adc_battery.hpp" +#include "husarion_ugv_utils/test/test_utils.hpp" using BatteryStateMsg = sensor_msgs::msg::BatteryState; using ChargingStatusMsg = panther_msgs::msg::ChargingStatus; @@ -54,7 +54,7 @@ class TestADCBattery : public testing::Test float battery_temp_raw_; float battery_charge_raw_; - std::unique_ptr battery_; + std::unique_ptr battery_; BatteryStateMsg battery_state_; ChargingStatusMsg charging_status_; @@ -62,8 +62,8 @@ class TestADCBattery : public testing::Test TestADCBattery::TestADCBattery() { - panther_battery::ADCBatteryParams params = {10, 10, 10, 10}; - battery_ = std::make_unique( + husarion_ugv_battery::ADCBatteryParams params = {10, 10, 10, 10}; + battery_ = std::make_unique( [&]() { return battery_voltage_raw_; }, [&]() { return battery_current_raw_; }, [&]() { return battery_temp_raw_; }, [&]() { return battery_charge_raw_; }, params); } @@ -92,8 +92,9 @@ void TestADCBattery::TestDefaultBatteryStateMsg( EXPECT_TRUE(std::isnan(battery_state_.capacity)); EXPECT_FLOAT_EQ(20.0, battery_state_.design_capacity); EXPECT_EQ(BatteryStateMsg::POWER_SUPPLY_TECHNOLOGY_LION, battery_state_.power_supply_technology); - EXPECT_TRUE(panther_utils::test_utils::CheckNaNVector(battery_state_.cell_voltage)); - EXPECT_TRUE(panther_utils::test_utils::CheckNaNVector(battery_state_.cell_temperature)); + EXPECT_TRUE(husarion_ugv_utils::test_utils::CheckNaNVector(battery_state_.cell_voltage)); + EXPECT_TRUE( + husarion_ugv_utils::test_utils::CheckNaNVector(battery_state_.cell_temperature)); EXPECT_TRUE(battery_state_.present); EXPECT_EQ("user_compartment", battery_state_.location); @@ -116,8 +117,9 @@ void TestADCBattery::TestBatteryStateMsg( EXPECT_TRUE(std::isnan(battery_state_.capacity)); EXPECT_FLOAT_EQ(20.0, battery_state_.design_capacity); EXPECT_FLOAT_EQ(expected_temp, battery_state_.temperature); - EXPECT_TRUE(panther_utils::test_utils::CheckNaNVector(battery_state_.cell_voltage)); - EXPECT_TRUE(panther_utils::test_utils::CheckNaNVector(battery_state_.cell_temperature)); + EXPECT_TRUE(husarion_ugv_utils::test_utils::CheckNaNVector(battery_state_.cell_voltage)); + EXPECT_TRUE( + husarion_ugv_utils::test_utils::CheckNaNVector(battery_state_.cell_temperature)); EXPECT_EQ(BatteryStateMsg::POWER_SUPPLY_TECHNOLOGY_LION, battery_state_.power_supply_technology); EXPECT_EQ("user_compartment", battery_state_.location); diff --git a/panther_battery/test/battery/test_battery.cpp b/husarion_ugv_battery/test/battery/test_battery.cpp similarity index 93% rename from panther_battery/test/battery/test_battery.cpp rename to husarion_ugv_battery/test/battery/test_battery.cpp index cdbdf3812..9b2d12c0d 100644 --- a/panther_battery/test/battery/test_battery.cpp +++ b/husarion_ugv_battery/test/battery/test_battery.cpp @@ -24,13 +24,13 @@ #include "panther_msgs/msg/charging_status.hpp" -#include "panther_battery/battery/battery.hpp" -#include "panther_utils/test/test_utils.hpp" +#include "husarion_ugv_battery/battery/battery.hpp" +#include "husarion_ugv_utils/test/test_utils.hpp" using BatteryStateMsg = sensor_msgs::msg::BatteryState; using ChargingStatusMsg = panther_msgs::msg::ChargingStatus; -class BatteryWrapper : public panther_battery::Battery +class BatteryWrapper : public husarion_ugv_battery::Battery { public: BatteryWrapper() {} @@ -80,8 +80,9 @@ void TestBattery::TestDefaultBatteryStateMsg( EXPECT_TRUE(std::isnan(battery_state_.capacity)); EXPECT_FLOAT_EQ(20.0, battery_state_.design_capacity); EXPECT_EQ(BatteryStateMsg::POWER_SUPPLY_TECHNOLOGY_LION, battery_state_.power_supply_technology); - EXPECT_TRUE(panther_utils::test_utils::CheckNaNVector(battery_state_.cell_voltage)); - EXPECT_TRUE(panther_utils::test_utils::CheckNaNVector(battery_state_.cell_temperature)); + EXPECT_TRUE(husarion_ugv_utils::test_utils::CheckNaNVector(battery_state_.cell_voltage)); + EXPECT_TRUE( + husarion_ugv_utils::test_utils::CheckNaNVector(battery_state_.cell_temperature)); EXPECT_TRUE(battery_state_.present); EXPECT_EQ("user_compartment", battery_state_.location); diff --git a/panther_battery/test/battery/test_roboteq_battery.cpp b/husarion_ugv_battery/test/battery/test_roboteq_battery.cpp similarity index 92% rename from panther_battery/test/battery/test_roboteq_battery.cpp rename to husarion_ugv_battery/test/battery/test_roboteq_battery.cpp index 8ca850f1f..26674df87 100644 --- a/panther_battery/test/battery/test_roboteq_battery.cpp +++ b/husarion_ugv_battery/test/battery/test_roboteq_battery.cpp @@ -27,18 +27,18 @@ #include "panther_msgs/msg/driver_state_named.hpp" #include "panther_msgs/msg/robot_driver_state.hpp" -#include "panther_battery/battery/roboteq_battery.hpp" -#include "panther_utils/test/test_utils.hpp" +#include "husarion_ugv_battery/battery/roboteq_battery.hpp" +#include "husarion_ugv_utils/test/test_utils.hpp" using BatteryStateMsg = sensor_msgs::msg::BatteryState; using RobotDriverStateMsg = panther_msgs::msg::RobotDriverState; -class RoboteqBatteryWrapper : public panther_battery::RoboteqBattery +class RoboteqBatteryWrapper : public husarion_ugv_battery::RoboteqBattery { public: RoboteqBatteryWrapper( const std::function & get_driver_state, - const panther_battery::RoboteqBatteryParams & params) + const husarion_ugv_battery::RoboteqBatteryParams & params) : RoboteqBattery(get_driver_state, params) { } @@ -73,7 +73,7 @@ class TestRoboteqBattery : public testing::Test TestRoboteqBattery::TestRoboteqBattery() { - const panther_battery::RoboteqBatteryParams params = {kRobotDriverStateTimeout, 10, 10}; + const husarion_ugv_battery::RoboteqBatteryParams params = {kRobotDriverStateTimeout, 10, 10}; battery_ = std::make_unique([&]() { return driver_state_; }, params); } @@ -105,8 +105,8 @@ void TestRoboteqBattery::TestDefaultBatteryStateMsg( EXPECT_TRUE(std::isnan(battery_state_.capacity)); EXPECT_FLOAT_EQ(20.0, battery_state_.design_capacity); EXPECT_EQ(BatteryStateMsg::POWER_SUPPLY_TECHNOLOGY_LION, battery_state_.power_supply_technology); - EXPECT_TRUE(panther_utils::test_utils::CheckNaNVector(battery_state_.cell_voltage)); - EXPECT_TRUE(panther_utils::test_utils::CheckNaNVector(battery_state_.cell_temperature)); + EXPECT_TRUE(husarion_ugv_utils::test_utils::CheckNaNVector(battery_state_.cell_voltage)); + EXPECT_TRUE(husarion_ugv_utils::test_utils::CheckNaNVector(battery_state_.cell_temperature)); EXPECT_TRUE(battery_state_.present); EXPECT_EQ("user_compartment", battery_state_.location); @@ -128,8 +128,8 @@ void TestRoboteqBattery::TestBatteryStateMsg( EXPECT_TRUE(std::isnan(battery_state_.capacity)); EXPECT_TRUE(std::isnan(battery_state_.temperature)); EXPECT_FLOAT_EQ(20.0, battery_state_.design_capacity); - EXPECT_TRUE(panther_utils::test_utils::CheckNaNVector(battery_state_.cell_voltage)); - EXPECT_TRUE(panther_utils::test_utils::CheckNaNVector(battery_state_.cell_temperature)); + EXPECT_TRUE(husarion_ugv_utils::test_utils::CheckNaNVector(battery_state_.cell_voltage)); + EXPECT_TRUE(husarion_ugv_utils::test_utils::CheckNaNVector(battery_state_.cell_temperature)); EXPECT_EQ(BatteryStateMsg::POWER_SUPPLY_TECHNOLOGY_LION, battery_state_.power_supply_technology); EXPECT_EQ("user_compartment", battery_state_.location); diff --git a/panther_battery/test/battery_publisher/test_battery_publisher.cpp b/husarion_ugv_battery/test/battery_publisher/test_battery_publisher.cpp similarity index 94% rename from panther_battery/test/battery_publisher/test_battery_publisher.cpp rename to husarion_ugv_battery/test/battery_publisher/test_battery_publisher.cpp index 4ed567b16..f5924c731 100644 --- a/panther_battery/test/battery_publisher/test_battery_publisher.cpp +++ b/husarion_ugv_battery/test/battery_publisher/test_battery_publisher.cpp @@ -24,18 +24,18 @@ #include "panther_msgs/msg/io_state.hpp" -#include "panther_battery/battery_publisher/battery_publisher.hpp" +#include "husarion_ugv_battery/battery_publisher/battery_publisher.hpp" using BatteryStateMsg = sensor_msgs::msg::BatteryState; using IOStateMsg = panther_msgs::msg::IOState; -class BatteryPublisherWrapper : public panther_battery::BatteryPublisher +class BatteryPublisherWrapper : public husarion_ugv_battery::BatteryPublisher { public: BatteryPublisherWrapper( const rclcpp::Node::SharedPtr & node, std::shared_ptr diagnostic_updater) - : panther_battery::BatteryPublisher(node, diagnostic_updater) + : husarion_ugv_battery::BatteryPublisher(node, diagnostic_updater) { } diff --git a/panther_battery/test/battery_publisher/test_dual_battery_publisher.cpp b/husarion_ugv_battery/test/battery_publisher/test_dual_battery_publisher.cpp similarity index 93% rename from panther_battery/test/battery_publisher/test_dual_battery_publisher.cpp rename to husarion_ugv_battery/test/battery_publisher/test_dual_battery_publisher.cpp index 0740b7fa9..74bcb3581 100644 --- a/panther_battery/test/battery_publisher/test_dual_battery_publisher.cpp +++ b/husarion_ugv_battery/test/battery_publisher/test_dual_battery_publisher.cpp @@ -24,22 +24,22 @@ #include "panther_msgs/msg/charging_status.hpp" -#include "panther_battery/battery/adc_battery.hpp" -#include "panther_battery/battery/battery.hpp" -#include "panther_battery/battery_publisher/dual_battery_publisher.hpp" -#include "panther_utils/test/ros_test_utils.hpp" +#include "husarion_ugv_battery/battery/adc_battery.hpp" +#include "husarion_ugv_battery/battery/battery.hpp" +#include "husarion_ugv_battery/battery_publisher/dual_battery_publisher.hpp" +#include "husarion_ugv_utils/test/ros_test_utils.hpp" using BatteryStateMsg = sensor_msgs::msg::BatteryState; using ChargingStatusMsg = panther_msgs::msg::ChargingStatus; -class DualBatteryPublisherWrapper : public panther_battery::DualBatteryPublisher +class DualBatteryPublisherWrapper : public husarion_ugv_battery::DualBatteryPublisher { public: DualBatteryPublisherWrapper( const rclcpp::Node::SharedPtr & node, std::shared_ptr diagnostic_updater, - std::shared_ptr & battery_1, - std::shared_ptr & battery_2) + std::shared_ptr & battery_1, + std::shared_ptr & battery_2) : DualBatteryPublisher(node, diagnostic_updater, battery_1, battery_2) { } @@ -90,8 +90,8 @@ class TestDualBatteryPublisher : public testing::Test rclcpp::Subscription::SharedPtr battery_1_sub_; rclcpp::Subscription::SharedPtr battery_2_sub_; - std::shared_ptr battery_1_; - std::shared_ptr battery_2_; + std::shared_ptr battery_1_; + std::shared_ptr battery_2_; std::shared_ptr battery_publisher_; BatteryStateMsg::SharedPtr battery_state_; BatteryStateMsg::SharedPtr battery_1_state_; @@ -100,11 +100,11 @@ class TestDualBatteryPublisher : public testing::Test TestDualBatteryPublisher::TestDualBatteryPublisher() { - panther_battery::ADCBatteryParams params = {10, 10, 10, 10}; - battery_1_ = std::make_shared( + husarion_ugv_battery::ADCBatteryParams params = {10, 10, 10, 10}; + battery_1_ = std::make_shared( [&]() { return 1.6; }, [&]() { return 0.02; }, [&]() { return 1.6; }, [&]() { return 0.4; }, params); - battery_2_ = std::make_shared( + battery_2_ = std::make_shared( [&]() { return 1.6; }, [&]() { return 0.02; }, [&]() { return 1.6; }, [&]() { return 0.4; }, params); @@ -139,13 +139,13 @@ void TestDualBatteryPublisher::TestMergeBatteryPowerSupplyStatus( TEST_F(TestDualBatteryPublisher, CorrectTopicPublished) { battery_publisher_->Publish(); - ASSERT_TRUE( - panther_utils::test_utils::WaitForMsg(node_, battery_state_, std::chrono::milliseconds(1000))); + ASSERT_TRUE(husarion_ugv_utils::test_utils::WaitForMsg( + node_, battery_state_, std::chrono::milliseconds(1000))); battery_publisher_->Publish(); - ASSERT_TRUE(panther_utils::test_utils::WaitForMsg( + ASSERT_TRUE(husarion_ugv_utils::test_utils::WaitForMsg( node_, battery_1_state_, std::chrono::milliseconds(1000))); battery_publisher_->Publish(); - ASSERT_TRUE(panther_utils::test_utils::WaitForMsg( + ASSERT_TRUE(husarion_ugv_utils::test_utils::WaitForMsg( node_, battery_2_state_, std::chrono::milliseconds(1000))); } diff --git a/panther_battery/test/battery_publisher/test_single_battery_publisher.cpp b/husarion_ugv_battery/test/battery_publisher/test_single_battery_publisher.cpp similarity index 75% rename from panther_battery/test/battery_publisher/test_single_battery_publisher.cpp rename to husarion_ugv_battery/test/battery_publisher/test_single_battery_publisher.cpp index f7a04c3fa..3d98a9a74 100644 --- a/panther_battery/test/battery_publisher/test_single_battery_publisher.cpp +++ b/husarion_ugv_battery/test/battery_publisher/test_single_battery_publisher.cpp @@ -21,10 +21,10 @@ #include "sensor_msgs/msg/battery_state.hpp" -#include "panther_battery/battery/adc_battery.hpp" -#include "panther_battery/battery/battery.hpp" -#include "panther_battery/battery_publisher/single_battery_publisher.hpp" -#include "panther_utils/test/ros_test_utils.hpp" +#include "husarion_ugv_battery/battery/adc_battery.hpp" +#include "husarion_ugv_battery/battery/battery.hpp" +#include "husarion_ugv_battery/battery_publisher/single_battery_publisher.hpp" +#include "husarion_ugv_utils/test/ros_test_utils.hpp" using BatteryStateMsg = sensor_msgs::msg::BatteryState; @@ -40,16 +40,16 @@ class TestSingleBatteryPublisher : public testing::Test rclcpp::Subscription::SharedPtr battery_sub_; rclcpp::Subscription::SharedPtr battery_1_sub_; - std::shared_ptr battery_; - std::shared_ptr battery_publisher_; + std::shared_ptr battery_; + std::shared_ptr battery_publisher_; BatteryStateMsg::SharedPtr battery_state_; BatteryStateMsg::SharedPtr battery_1_state_; }; TestSingleBatteryPublisher::TestSingleBatteryPublisher() { - panther_battery::ADCBatteryParams params = {10, 10, 10, 10}; - battery_ = std::make_shared( + husarion_ugv_battery::ADCBatteryParams params = {10, 10, 10, 10}; + battery_ = std::make_shared( [&]() { return 1.6; }, [&]() { return 0.02; }, [&]() { return 1.6; }, [&]() { return 0.4; }, params); @@ -61,17 +61,17 @@ TestSingleBatteryPublisher::TestSingleBatteryPublisher() battery_1_sub_ = node_->create_subscription( "/_battery/battery_1_status_raw", 10, [&](const BatteryStateMsg::SharedPtr msg) { battery_1_state_ = msg; }); - battery_publisher_ = std::make_shared( + battery_publisher_ = std::make_shared( node_, diagnostic_updater_, battery_); } TEST_F(TestSingleBatteryPublisher, CorrectTopicPublished) { battery_publisher_->Publish(); - ASSERT_TRUE( - panther_utils::test_utils::WaitForMsg(node_, battery_state_, std::chrono::milliseconds(1000))); + ASSERT_TRUE(husarion_ugv_utils::test_utils::WaitForMsg( + node_, battery_state_, std::chrono::milliseconds(1000))); battery_publisher_->Publish(); - ASSERT_TRUE(panther_utils::test_utils::WaitForMsg( + ASSERT_TRUE(husarion_ugv_utils::test_utils::WaitForMsg( node_, battery_1_state_, std::chrono::milliseconds(1000))); } diff --git a/panther_battery/test/test_adc_data_reader.cpp b/husarion_ugv_battery/test/test_adc_data_reader.cpp similarity index 92% rename from panther_battery/test/test_adc_data_reader.cpp rename to husarion_ugv_battery/test/test_adc_data_reader.cpp index c9fd3d943..bbb322bc8 100644 --- a/panther_battery/test/test_adc_data_reader.cpp +++ b/husarion_ugv_battery/test/test_adc_data_reader.cpp @@ -18,7 +18,7 @@ #include "gtest/gtest.h" -#include "panther_battery/adc_data_reader.hpp" +#include "husarion_ugv_battery/adc_data_reader.hpp" class TestADCDataReader : public testing::Test { @@ -27,7 +27,7 @@ class TestADCDataReader : public testing::Test ~TestADCDataReader(); protected: - std::shared_ptr data_reader_; + std::shared_ptr data_reader_; std::filesystem::path data_file_path_; std::filesystem::path scale_file_path_; std::ofstream file_; @@ -44,7 +44,7 @@ TestADCDataReader::TestADCDataReader() WriteNumberToFile(1.0, scale_file_path_); - data_reader_ = std::make_shared(current_path); + data_reader_ = std::make_shared(current_path); } TestADCDataReader::~TestADCDataReader() diff --git a/panther_battery/test/test_battery_driver_node_adc_dual.cpp b/husarion_ugv_battery/test/test_battery_driver_node_adc_dual.cpp similarity index 91% rename from panther_battery/test/test_battery_driver_node_adc_dual.cpp rename to husarion_ugv_battery/test/test_battery_driver_node_adc_dual.cpp index 740ba838d..2718407a7 100644 --- a/panther_battery/test/test_battery_driver_node_adc_dual.cpp +++ b/husarion_ugv_battery/test/test_battery_driver_node_adc_dual.cpp @@ -20,7 +20,7 @@ #include "rclcpp/rclcpp.hpp" -#include "panther_utils/test/ros_test_utils.hpp" +#include "husarion_ugv_utils/test/ros_test_utils.hpp" class TestBatteryNodeADCDual : public TestBatteryNode { @@ -30,7 +30,7 @@ class TestBatteryNodeADCDual : public TestBatteryNode TEST_F(TestBatteryNodeADCDual, BatteryValues) { - ASSERT_TRUE(panther_utils::test_utils::WaitForMsg( + ASSERT_TRUE(husarion_ugv_utils::test_utils::WaitForMsg( battery_driver_node_, battery_state_, std::chrono::milliseconds(5000))); // This is done to check if channels of ADC readers were assigned correctly, not to verify @@ -51,7 +51,7 @@ TEST_F(TestBatteryNodeADCDual, BatteryValues) // Change value of battery 2 reading one by one and check if corresponding values in battery 1 // stops matching WriteNumberToFile(1600, std::filesystem::path(device1_path_ / "in_voltage3_raw")); - ASSERT_TRUE(panther_utils::test_utils::WaitForMsg( + ASSERT_TRUE(husarion_ugv_utils::test_utils::WaitForMsg( battery_driver_node_, battery_2_state_, std::chrono::milliseconds(1000))); EXPECT_FALSE( fabs(battery_1_state_->voltage - battery_2_state_->voltage) < @@ -67,7 +67,7 @@ TEST_F(TestBatteryNodeADCDual, BatteryValues) WriteNumberToFile(900, std::filesystem::path(device1_path_ / "in_voltage1_raw")); WriteNumberToFile(100, std::filesystem::path(device0_path_ / "in_voltage2_raw")); - ASSERT_TRUE(panther_utils::test_utils::WaitForMsg( + ASSERT_TRUE(husarion_ugv_utils::test_utils::WaitForMsg( battery_driver_node_, battery_2_state_, std::chrono::milliseconds(1000))); EXPECT_FALSE( fabs(battery_1_state_->current - battery_2_state_->current) < @@ -75,7 +75,7 @@ TEST_F(TestBatteryNodeADCDual, BatteryValues) EXPECT_FLOAT_EQ(battery_1_state_->temperature, battery_2_state_->temperature); WriteNumberToFile(1000, std::filesystem::path(device0_path_ / "in_voltage0_raw")); - ASSERT_TRUE(panther_utils::test_utils::WaitForMsg( + ASSERT_TRUE(husarion_ugv_utils::test_utils::WaitForMsg( battery_driver_node_, battery_2_state_, std::chrono::milliseconds(1000))); EXPECT_FALSE( fabs(battery_1_state_->temperature - battery_2_state_->temperature) < @@ -84,7 +84,7 @@ TEST_F(TestBatteryNodeADCDual, BatteryValues) TEST_F(TestBatteryNodeADCDual, BatteryTimeout) { - ASSERT_TRUE(panther_utils::test_utils::WaitForMsg( + ASSERT_TRUE(husarion_ugv_utils::test_utils::WaitForMsg( battery_driver_node_, battery_state_, std::chrono::milliseconds(5000))); // Battery state msg should have some values @@ -98,7 +98,7 @@ TEST_F(TestBatteryNodeADCDual, BatteryTimeout) std::filesystem::remove(std::filesystem::path(device0_path_ / "in_voltage2_raw")); std::filesystem::remove(std::filesystem::path(device1_path_ / "in_voltage2_raw")); std::this_thread::sleep_for(std::chrono::milliseconds(2500)); - ASSERT_TRUE(panther_utils::test_utils::WaitForMsg( + ASSERT_TRUE(husarion_ugv_utils::test_utils::WaitForMsg( battery_driver_node_, battery_state_, std::chrono::milliseconds(1000))); // Battery state msg values should be NaN @@ -114,14 +114,14 @@ TEST_F(TestBatteryNodeADCDual, BatteryTimeout) TEST_F(TestBatteryNodeADCDual, BatteryCharging) { // Wait for node to initialize - ASSERT_TRUE(panther_utils::test_utils::WaitForMsg( + ASSERT_TRUE(husarion_ugv_utils::test_utils::WaitForMsg( battery_driver_node_, battery_state_, std::chrono::milliseconds(5000))); // Publish charger connected state IOStateMsg io_state; io_state.charger_connected = true; io_state_pub_->publish(io_state); - ASSERT_TRUE(panther_utils::test_utils::WaitForMsg( + ASSERT_TRUE(husarion_ugv_utils::test_utils::WaitForMsg( battery_driver_node_, battery_state_, std::chrono::milliseconds(1000))); EXPECT_NE(battery_state_->power_supply_status, BatteryStateMsg::POWER_SUPPLY_STATUS_DISCHARGING); diff --git a/panther_battery/test/test_battery_driver_node_adc_single.cpp b/husarion_ugv_battery/test/test_battery_driver_node_adc_single.cpp similarity index 91% rename from panther_battery/test/test_battery_driver_node_adc_single.cpp rename to husarion_ugv_battery/test/test_battery_driver_node_adc_single.cpp index cc26bfe76..8c0ec4987 100644 --- a/panther_battery/test/test_battery_driver_node_adc_single.cpp +++ b/husarion_ugv_battery/test/test_battery_driver_node_adc_single.cpp @@ -20,7 +20,7 @@ #include "rclcpp/rclcpp.hpp" -#include "panther_utils/test/ros_test_utils.hpp" +#include "husarion_ugv_utils/test/ros_test_utils.hpp" class TestBatteryNodeADCSingle : public TestBatteryNode { @@ -35,7 +35,7 @@ TEST_F(TestBatteryNodeADCSingle, BatteryValues) WriteNumberToFile(1600, std::filesystem::path(device1_path_ / "in_voltage3_raw")); WriteNumberToFile(100, std::filesystem::path(device0_path_ / "in_voltage2_raw")); - ASSERT_TRUE(panther_utils::test_utils::WaitForMsg( + ASSERT_TRUE(husarion_ugv_utils::test_utils::WaitForMsg( battery_driver_node_, battery_state_, std::chrono::milliseconds(5000))); // This is done to check if channels of ADC readers were assigned correctly, not to verify @@ -56,7 +56,7 @@ TEST_F(TestBatteryNodeADCSingle, BatteryValues) TEST_F(TestBatteryNodeADCSingle, BatteryTimeout) { - ASSERT_TRUE(panther_utils::test_utils::WaitForMsg( + ASSERT_TRUE(husarion_ugv_utils::test_utils::WaitForMsg( battery_driver_node_, battery_state_, std::chrono::milliseconds(5000))); // Battery state msg should have some values @@ -70,7 +70,7 @@ TEST_F(TestBatteryNodeADCSingle, BatteryTimeout) std::filesystem::remove(std::filesystem::path(device0_path_ / "in_voltage2_raw")); std::filesystem::remove(std::filesystem::path(device1_path_ / "in_voltage2_raw")); std::this_thread::sleep_for(std::chrono::milliseconds(2500)); - ASSERT_TRUE(panther_utils::test_utils::WaitForMsg( + ASSERT_TRUE(husarion_ugv_utils::test_utils::WaitForMsg( battery_driver_node_, battery_state_, std::chrono::milliseconds(1000))); // Battery state msg values should be NaN @@ -86,14 +86,14 @@ TEST_F(TestBatteryNodeADCSingle, BatteryTimeout) TEST_F(TestBatteryNodeADCSingle, BatteryCharging) { // Wait for node to initialize - ASSERT_TRUE(panther_utils::test_utils::WaitForMsg( + ASSERT_TRUE(husarion_ugv_utils::test_utils::WaitForMsg( battery_driver_node_, battery_state_, std::chrono::milliseconds(5000))); // Publish charger connected state IOStateMsg io_state; io_state.charger_connected = true; io_state_pub_->publish(io_state); - ASSERT_TRUE(panther_utils::test_utils::WaitForMsg( + ASSERT_TRUE(husarion_ugv_utils::test_utils::WaitForMsg( battery_driver_node_, battery_state_, std::chrono::milliseconds(1000))); EXPECT_NE(battery_state_->power_supply_status, BatteryStateMsg::POWER_SUPPLY_STATUS_DISCHARGING); @@ -105,7 +105,7 @@ TEST_F(TestBatteryNodeADCSingle, RoboteqInitOnADCFail) std::filesystem::remove_all(device0_path_); // Wait for node to initialize - ASSERT_TRUE(panther_utils::test_utils::WaitForMsg( + ASSERT_TRUE(husarion_ugv_utils::test_utils::WaitForMsg( battery_driver_node_, battery_state_, std::chrono::milliseconds(5000))); // Battery state status should be UNKNOWN @@ -116,7 +116,7 @@ TEST_F(TestBatteryNodeADCSingle, RoboteqInitOnADCFail) driver_state.header.stamp = battery_driver_node_->get_clock()->now(); driver_state_pub_->publish(driver_state); - ASSERT_TRUE(panther_utils::test_utils::WaitForMsg( + ASSERT_TRUE(husarion_ugv_utils::test_utils::WaitForMsg( battery_driver_node_, battery_state_, std::chrono::milliseconds(1000))); // Battery state status should be different than UNKNOWN diff --git a/panther_battery/test/test_battery_driver_node_roboteq.cpp b/husarion_ugv_battery/test/test_battery_driver_node_roboteq.cpp similarity index 93% rename from panther_battery/test/test_battery_driver_node_roboteq.cpp rename to husarion_ugv_battery/test/test_battery_driver_node_roboteq.cpp index 84eb00b9c..8393b1b9f 100644 --- a/panther_battery/test/test_battery_driver_node_roboteq.cpp +++ b/husarion_ugv_battery/test/test_battery_driver_node_roboteq.cpp @@ -22,7 +22,7 @@ #include "rclcpp/rclcpp.hpp" -#include "panther_utils/test/ros_test_utils.hpp" +#include "husarion_ugv_utils/test/ros_test_utils.hpp" class TestBatteryNodeRoboteq : public TestBatteryNode { @@ -33,7 +33,7 @@ class TestBatteryNodeRoboteq : public TestBatteryNode TEST_F(TestBatteryNodeRoboteq, BatteryValues) { // Wait for node to initialize - ASSERT_TRUE(panther_utils::test_utils::WaitForMsg( + ASSERT_TRUE(husarion_ugv_utils::test_utils::WaitForMsg( battery_driver_node_, battery_state_, std::chrono::milliseconds(5000))); // Battery state msg values should be NaN @@ -54,7 +54,7 @@ TEST_F(TestBatteryNodeRoboteq, BatteryValues) driver_state.driver_states.push_back(motor_controller); driver_state_pub_->publish(driver_state); - ASSERT_TRUE(panther_utils::test_utils::WaitForMsg( + ASSERT_TRUE(husarion_ugv_utils::test_utils::WaitForMsg( battery_driver_node_, battery_state_, std::chrono::milliseconds(1000))); // This is done to check if values were read correctly, not to verify calculations. @@ -72,7 +72,7 @@ TEST_F(TestBatteryNodeRoboteq, BatteryValues) TEST_F(TestBatteryNodeRoboteq, BatteryTimeout) { // Wait for node to initialize - ASSERT_TRUE(panther_utils::test_utils::WaitForMsg( + ASSERT_TRUE(husarion_ugv_utils::test_utils::WaitForMsg( battery_driver_node_, battery_state_, std::chrono::milliseconds(5000))); // Battery state msg values should be NaN @@ -94,7 +94,7 @@ TEST_F(TestBatteryNodeRoboteq, BatteryTimeout) driver_state.driver_states.push_back(motor_controller); driver_state_pub_->publish(driver_state); - ASSERT_TRUE(panther_utils::test_utils::WaitForMsg( + ASSERT_TRUE(husarion_ugv_utils::test_utils::WaitForMsg( battery_driver_node_, battery_state_, std::chrono::milliseconds(1000))); // Battery state msg should have some values @@ -105,7 +105,7 @@ TEST_F(TestBatteryNodeRoboteq, BatteryTimeout) // Wait for timeout std::this_thread::sleep_for(std::chrono::milliseconds(1500)); - ASSERT_TRUE(panther_utils::test_utils::WaitForMsg( + ASSERT_TRUE(husarion_ugv_utils::test_utils::WaitForMsg( battery_driver_node_, battery_state_, std::chrono::milliseconds(1000))); // Battery state msg values should be NaN diff --git a/panther_battery/test/utils/test_battery_driver_node.hpp b/husarion_ugv_battery/test/utils/test_battery_driver_node.hpp similarity index 93% rename from panther_battery/test/utils/test_battery_driver_node.hpp rename to husarion_ugv_battery/test/utils/test_battery_driver_node.hpp index bad9542c3..319dfd6db 100644 --- a/panther_battery/test/utils/test_battery_driver_node.hpp +++ b/husarion_ugv_battery/test/utils/test_battery_driver_node.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_BATTERY_UTILS_TEST_BATTERY_DRIVER_NODE_HPP_ -#define PANTHER_BATTERY_UTILS_TEST_BATTERY_DRIVER_NODE_HPP_ +#ifndef HUSARION_UGV_BATTERY_UTILS_TEST_BATTERY_DRIVER_NODE_HPP_ +#define HUSARION_UGV_BATTERY_UTILS_TEST_BATTERY_DRIVER_NODE_HPP_ #include #include @@ -31,7 +31,7 @@ #include "panther_msgs/msg/io_state.hpp" #include "panther_msgs/msg/robot_driver_state.hpp" -#include "panther_battery/battery_driver_node.hpp" +#include "husarion_ugv_battery/battery_driver_node.hpp" using BatteryStateMsg = sensor_msgs::msg::BatteryState; using RobotDriverStateMsg = panther_msgs::msg::RobotDriverState; @@ -55,7 +55,7 @@ class TestBatteryNode : public testing::Test BatteryStateMsg::SharedPtr battery_state_; BatteryStateMsg::SharedPtr battery_1_state_; BatteryStateMsg::SharedPtr battery_2_state_; - std::shared_ptr battery_driver_node_; + std::shared_ptr battery_driver_node_; rclcpp::Subscription::SharedPtr battery_sub_; rclcpp::Subscription::SharedPtr battery_1_sub_; rclcpp::Subscription::SharedPtr battery_2_sub_; @@ -103,7 +103,7 @@ TestBatteryNode::TestBatteryNode(const bool use_adc_battery, const bool dual_bat rclcpp::NodeOptions options; options.parameter_overrides(params); - battery_driver_node_ = std::make_shared( + battery_driver_node_ = std::make_shared( "battery_driver", options); battery_sub_ = battery_driver_node_->create_subscription( @@ -145,4 +145,4 @@ void TestBatteryNode::WriteNumberToFile(const T number, const std::string & file } } -#endif // PANTHER_BATTERY_UTILS_TEST_BATTERY_DRIVER_NODE_HPP_ +#endif // HUSARION_UGV_BATTERY_UTILS_TEST_BATTERY_DRIVER_NODE_HPP_ diff --git a/panther_bringup/CHANGELOG.rst b/husarion_ugv_bringup/CHANGELOG.rst similarity index 100% rename from panther_bringup/CHANGELOG.rst rename to husarion_ugv_bringup/CHANGELOG.rst diff --git a/panther_bringup/CMakeLists.txt b/husarion_ugv_bringup/CMakeLists.txt similarity index 83% rename from panther_bringup/CMakeLists.txt rename to husarion_ugv_bringup/CMakeLists.txt index 793057508..6fb4694db 100644 --- a/panther_bringup/CMakeLists.txt +++ b/husarion_ugv_bringup/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.10.2) -project(panther_bringup) +project(husarion_ugv_bringup) find_package(ament_cmake REQUIRED) diff --git a/panther_bringup/README.md b/husarion_ugv_bringup/README.md similarity index 87% rename from panther_bringup/README.md rename to husarion_ugv_bringup/README.md index b12b4218d..caafb8c83 100644 --- a/panther_bringup/README.md +++ b/husarion_ugv_bringup/README.md @@ -1,6 +1,6 @@ -# panther_bringup +# husarion_ugv_bringup -The package contains the default configuration and launch files necessary to start all the basic functionalities of the Husarion Panther robot. +The package contains the default configuration and launch files necessary to start all the basic functionalities of the Husarion UGV robots. ## Launch Files diff --git a/panther_bringup/launch/bringup.launch.py b/husarion_ugv_bringup/launch/bringup.launch.py similarity index 87% rename from panther_bringup/launch/bringup.launch.py rename to husarion_ugv_bringup/launch/bringup.launch.py index c291d92ce..e27d71043 100644 --- a/panther_bringup/launch/bringup.launch.py +++ b/husarion_ugv_bringup/launch/bringup.launch.py @@ -16,6 +16,7 @@ import os +from husarion_ugv_utils.messages import welcome_msg from launch import LaunchDescription from launch.actions import DeclareLaunchArgument, IncludeLaunchDescription, TimerAction from launch.conditions import IfCondition, UnlessCondition @@ -26,7 +27,6 @@ PathJoinSubstitution, ) from launch_ros.substitutions import FindPackageShare -from panther_utils.messages import welcome_msg def generate_launch_description(): @@ -63,7 +63,7 @@ def generate_launch_description(): controller_launch = IncludeLaunchDescription( PythonLaunchDescriptionSource( PathJoinSubstitution( - [FindPackageShare("panther_controller"), "launch", "controller.launch.py"] + [FindPackageShare("husarion_ugv_controller"), "launch", "controller.launch.py"] ) ), launch_arguments={"namespace": namespace}.items(), @@ -73,7 +73,7 @@ def generate_launch_description(): PythonLaunchDescriptionSource( PathJoinSubstitution( [ - FindPackageShare("panther_diagnostics"), + FindPackageShare("husarion_ugv_diagnostics"), "launch", "system_monitor.launch.py", ] @@ -85,7 +85,7 @@ def generate_launch_description(): lights_launch = IncludeLaunchDescription( PythonLaunchDescriptionSource( PathJoinSubstitution( - [FindPackageShare("panther_lights"), "launch", "lights.launch.py"] + [FindPackageShare("husarion_ugv_lights"), "launch", "lights.launch.py"] ) ), launch_arguments={"namespace": namespace}.items(), @@ -94,7 +94,7 @@ def generate_launch_description(): battery_launch = IncludeLaunchDescription( PythonLaunchDescriptionSource( PathJoinSubstitution( - [FindPackageShare("panther_battery"), "launch", "battery.launch.py"] + [FindPackageShare("husarion_ugv_battery"), "launch", "battery.launch.py"] ), ), launch_arguments={"namespace": namespace}.items(), @@ -103,7 +103,7 @@ def generate_launch_description(): ekf_launch = IncludeLaunchDescription( PythonLaunchDescriptionSource( PathJoinSubstitution( - [FindPackageShare("panther_localization"), "launch", "localization.launch.py"] + [FindPackageShare("husarion_ugv_localization"), "launch", "localization.launch.py"] ) ), launch_arguments={"namespace": namespace}.items(), @@ -113,7 +113,7 @@ def generate_launch_description(): manager_launch = IncludeLaunchDescription( PythonLaunchDescriptionSource( PathJoinSubstitution( - [FindPackageShare("panther_manager"), "launch", "manager.launch.py"] + [FindPackageShare("husarion_ugv_manager"), "launch", "manager.launch.py"] ) ), condition=UnlessCondition(disable_manager), diff --git a/panther_bringup/package.xml b/husarion_ugv_bringup/package.xml similarity index 80% rename from panther_bringup/package.xml rename to husarion_ugv_bringup/package.xml index a5fe44b42..4639b0781 100644 --- a/panther_bringup/package.xml +++ b/husarion_ugv_bringup/package.xml @@ -1,9 +1,9 @@ - panther_bringup + husarion_ugv_bringup 2.1.1 - Default launch files and configuration used to start Husarion Panther robot + Default launch files and configuration used to start Husarion UGV robots Husarion Apache License 2.0 @@ -15,15 +15,15 @@ ament_cmake + husarion_ugv_battery + husarion_ugv_controller + husarion_ugv_diagnostics + husarion_ugv_lights + husarion_ugv_localization + husarion_ugv_manager + husarion_ugv_utils launch launch_ros - panther_battery - panther_controller - panther_diagnostics - panther_lights - panther_localization - panther_manager - panther_utils ament_cmake diff --git a/panther_controller/CHANGELOG.rst b/husarion_ugv_controller/CHANGELOG.rst similarity index 100% rename from panther_controller/CHANGELOG.rst rename to husarion_ugv_controller/CHANGELOG.rst diff --git a/panther_localization/CMakeLists.txt b/husarion_ugv_controller/CMakeLists.txt similarity index 82% rename from panther_localization/CMakeLists.txt rename to husarion_ugv_controller/CMakeLists.txt index 33da28a6f..9cf8423aa 100644 --- a/panther_localization/CMakeLists.txt +++ b/husarion_ugv_controller/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.10.2) -project(panther_localization) +project(husarion_ugv_controller) find_package(ament_cmake REQUIRED) diff --git a/husarion_ugv_controller/CONFIGURATION.md b/husarion_ugv_controller/CONFIGURATION.md new file mode 100644 index 000000000..01a40d15c --- /dev/null +++ b/husarion_ugv_controller/CONFIGURATION.md @@ -0,0 +1,9 @@ +# husarion_ugv_controller + +## Changing Velocity Smoothing Parameters + +The default drive controller is based on [diff_drive_controller](https://control.ros.org/master/doc/ros2_controllers/diff_drive_controller/doc/userdoc.html) from [ros2 control](https://control.ros.org/master/index.html) or [mecanum_drive_controller](https://github.com/husarion/husarion_controllers/tree/main/mecanum_drive_controller). This controller can be customized, among others: by modifying the robot's dynamic parameters (e.g. smooth the speed or limit the robot's speed and acceleration). Its parameters can be found in the [husarion_ugv_controller](https://github.com/husarion/panther_ros/tree/ros2-devel/husarion_ugv_controller/config). By default, these values correspond to the upper limits of the robot's velocities and accelerations. + +## Changing Wheel Type + +Changing wheel types is possible and can be done for both the real robot and the simulation. By default, three types of wheels are supported using the launch argument `wheel_type`. If you want to use custom wheels, all you need to do is point to the new wheel and controller configuration files using the `wheel_config_path` and `controller_config_path` parameters. These files should be based on the default files, i.e. [WH01_controller.yaml](./config/WH01_controller.yaml) and [WH01.yaml](../panther_description/config/WH01.yaml). diff --git a/panther_controller/README.md b/husarion_ugv_controller/README.md similarity index 95% rename from panther_controller/README.md rename to husarion_ugv_controller/README.md index ac600dc72..f2deb0652 100644 --- a/panther_controller/README.md +++ b/husarion_ugv_controller/README.md @@ -1,6 +1,6 @@ -# panther_controller +# husarion_ugv_controller -The package contains the default configuration and launch files necessary to start all the basic functionalities of the Husarion Panther robot. +The package contains the default configuration and launch files necessary to start all the basic functionalities of the Husarion UGV robots. ## Launch Files diff --git a/panther_controller/config/WH01_controller.yaml b/husarion_ugv_controller/config/WH01_controller.yaml similarity index 100% rename from panther_controller/config/WH01_controller.yaml rename to husarion_ugv_controller/config/WH01_controller.yaml diff --git a/panther_controller/config/WH02_controller.yaml b/husarion_ugv_controller/config/WH02_controller.yaml similarity index 100% rename from panther_controller/config/WH02_controller.yaml rename to husarion_ugv_controller/config/WH02_controller.yaml diff --git a/panther_controller/config/WH04_controller.yaml b/husarion_ugv_controller/config/WH04_controller.yaml similarity index 98% rename from panther_controller/config/WH04_controller.yaml rename to husarion_ugv_controller/config/WH04_controller.yaml index 259873503..b13bbd11e 100644 --- a/panther_controller/config/WH04_controller.yaml +++ b/husarion_ugv_controller/config/WH04_controller.yaml @@ -32,7 +32,7 @@ wheel_separation: 0.616 wheel_radius: 0.1016 - # todo: check it for panther + # TODO: check it # For skid drive kinematics it will act as ICR coefficient, kinematic model with ICR # coefficient isn't totally accurate and this coefficient can differ for various ground types wheel_separation_multiplier: 1.0 diff --git a/panther_controller/config/WH05_controller.yaml b/husarion_ugv_controller/config/WH05_controller.yaml similarity index 100% rename from panther_controller/config/WH05_controller.yaml rename to husarion_ugv_controller/config/WH05_controller.yaml diff --git a/panther_controller/launch/controller.launch.py b/husarion_ugv_controller/launch/controller.launch.py similarity index 97% rename from panther_controller/launch/controller.launch.py rename to husarion_ugv_controller/launch/controller.launch.py index adf839650..2e61a3702 100644 --- a/panther_controller/launch/controller.launch.py +++ b/husarion_ugv_controller/launch/controller.launch.py @@ -52,8 +52,8 @@ def generate_launch_description(): ), description=( "Additional components configuration file. Components described in this file " - "are dynamically included in Panther's urdf." - "Panther options are described here " + "are dynamically included in robot's URDF." + "Available options are described in the manual: " "https://husarion.com/manuals/panther/panther-options/" ), ) @@ -64,14 +64,14 @@ def generate_launch_description(): "controller_config_path", default_value=PathJoinSubstitution( [ - FindPackageShare("panther_controller"), + FindPackageShare("husarion_ugv_controller"), "config", PythonExpression(["'", wheel_type, "_controller.yaml'"]), ] ), description=( "Path to controller configuration file. By default, it is located in" - " 'panther_controller/config/{wheel_type}_controller.yaml'. You can also specify" + " 'husarion_ugv_controller/config/{wheel_type}_controller.yaml'. You can also specify" " the path to your custom controller configuration file here. " ), ) diff --git a/panther_controller/package.xml b/husarion_ugv_controller/package.xml similarity index 88% rename from panther_controller/package.xml rename to husarion_ugv_controller/package.xml index 6dea3a07d..ec8101f41 100644 --- a/panther_controller/package.xml +++ b/husarion_ugv_controller/package.xml @@ -1,9 +1,9 @@ - panther_controller + husarion_ugv_controller 2.1.1 - ros2 controllers configuration for Panther + ros2 controllers configuration for Husarion UGV robots Husarion Apache License 2.0 @@ -18,6 +18,7 @@ controller_manager diff_drive_controller + husarion_ugv_hardware_interfaces imu_sensor_broadcaster joint_state_broadcaster launch @@ -25,7 +26,6 @@ lynx_description mecanum_drive_controller panther_description - panther_hardware_interfaces robot_state_publisher xacro diff --git a/panther_diagnostics/CHANGELOG.rst b/husarion_ugv_diagnostics/CHANGELOG.rst similarity index 100% rename from panther_diagnostics/CHANGELOG.rst rename to husarion_ugv_diagnostics/CHANGELOG.rst diff --git a/panther_diagnostics/CMakeLists.txt b/husarion_ugv_diagnostics/CMakeLists.txt similarity index 97% rename from panther_diagnostics/CMakeLists.txt rename to husarion_ugv_diagnostics/CMakeLists.txt index 8794efbed..64b9751d5 100644 --- a/panther_diagnostics/CMakeLists.txt +++ b/husarion_ugv_diagnostics/CMakeLists.txt @@ -8,7 +8,7 @@ if(USE_SUPERBUILD) include(cmake/SuperBuild.cmake) return() else() - project(panther_diagnostics) + project(husarion_ugv_diagnostics) endif() if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") @@ -21,7 +21,7 @@ set(PACKAGE_DEPENDENCIES diagnostic_updater generate_parameter_library panther_msgs - panther_utils + husarion_ugv_utils PkgConfig rclcpp std_msgs) diff --git a/panther_diagnostics/README.md b/husarion_ugv_diagnostics/README.md similarity index 95% rename from panther_diagnostics/README.md rename to husarion_ugv_diagnostics/README.md index d3e213bbd..542a05ad7 100644 --- a/panther_diagnostics/README.md +++ b/husarion_ugv_diagnostics/README.md @@ -1,6 +1,6 @@ -# panther_diagnostics +# husarion_ugv_diagnostics -Package containing nodes monitoring and publishing the Built-in Computer status of Husarion Panther robot. +Package containing nodes monitoring and publishing the Built-in Computer status of Husarion UGV robots. ## Launch Files diff --git a/panther_diagnostics/cmake/SuperBuild.cmake b/husarion_ugv_diagnostics/cmake/SuperBuild.cmake similarity index 97% rename from panther_diagnostics/cmake/SuperBuild.cmake rename to husarion_ugv_diagnostics/cmake/SuperBuild.cmake index 4370b4cdd..83fdadbb3 100644 --- a/panther_diagnostics/cmake/SuperBuild.cmake +++ b/husarion_ugv_diagnostics/cmake/SuperBuild.cmake @@ -30,7 +30,7 @@ ExternalProject_Add( BUILD_IN_SOURCE 1) ExternalProject_Add( - ep_panther_diagnostics + ep_husarion_ugv_diagnostics DEPENDS ${DEPENDENCIES} SOURCE_DIR ${PROJECT_SOURCE_DIR} CMAKE_ARGS -DUSE_SUPERBUILD=OFF diff --git a/panther_diagnostics/config/system_monitor.yaml b/husarion_ugv_diagnostics/config/system_monitor.yaml similarity index 100% rename from panther_diagnostics/config/system_monitor.yaml rename to husarion_ugv_diagnostics/config/system_monitor.yaml diff --git a/panther_diagnostics/include/panther_diagnostics/filesystem.hpp b/husarion_ugv_diagnostics/include/husarion_ugv_diagnostics/filesystem.hpp similarity index 93% rename from panther_diagnostics/include/panther_diagnostics/filesystem.hpp rename to husarion_ugv_diagnostics/include/husarion_ugv_diagnostics/filesystem.hpp index fa2291d62..178253124 100644 --- a/panther_diagnostics/include/panther_diagnostics/filesystem.hpp +++ b/husarion_ugv_diagnostics/include/husarion_ugv_diagnostics/filesystem.hpp @@ -12,13 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_DIAGNOSTICS_FILESYSTEM_HPP_ -#define PANTHER_DIAGNOSTICS_FILESYSTEM_HPP_ +#ifndef HUSARION_UGV_DIAGNOSTICS_FILESYSTEM_HPP_ +#define HUSARION_UGV_DIAGNOSTICS_FILESYSTEM_HPP_ #include #include -namespace panther_diagnostics +namespace husarion_ugv_diagnostics { /** @@ -110,6 +110,6 @@ class Filesystem : public FilesystemInterface } }; -} // namespace panther_diagnostics +} // namespace husarion_ugv_diagnostics -#endif // PANTHER_DIAGNOSTICS_FILESYSTEM_HPP_ +#endif // HUSARION_UGV_DIAGNOSTICS_FILESYSTEM_HPP_ diff --git a/panther_diagnostics/include/panther_diagnostics/system_monitor_node.hpp b/husarion_ugv_diagnostics/include/husarion_ugv_diagnostics/system_monitor_node.hpp similarity index 87% rename from panther_diagnostics/include/panther_diagnostics/system_monitor_node.hpp rename to husarion_ugv_diagnostics/include/husarion_ugv_diagnostics/system_monitor_node.hpp index c840a246b..0532822f6 100644 --- a/panther_diagnostics/include/panther_diagnostics/system_monitor_node.hpp +++ b/husarion_ugv_diagnostics/include/husarion_ugv_diagnostics/system_monitor_node.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_DIAGNOSTICS_SYSTEM_MONITOR_NODE_HPP_ -#define PANTHER_DIAGNOSTICS_SYSTEM_MONITOR_NODE_HPP_ +#ifndef HUSARION_UGV_DIAGNOSTICS_SYSTEM_MONITOR_NODE_HPP_ +#define HUSARION_UGV_DIAGNOSTICS_SYSTEM_MONITOR_NODE_HPP_ #include @@ -24,12 +24,12 @@ #include "system_monitor_parameters.hpp" -#include "panther_diagnostics/filesystem.hpp" -#include "panther_diagnostics/types.hpp" +#include "husarion_ugv_diagnostics/filesystem.hpp" +#include "husarion_ugv_diagnostics/types.hpp" using namespace std::chrono_literals; -namespace panther_diagnostics +namespace husarion_ugv_diagnostics { class SystemMonitorNode : public rclcpp::Node @@ -81,5 +81,5 @@ class SystemMonitorNode : public rclcpp::Node static constexpr char kTemperatureInfoFilename[] = "/sys/class/thermal/thermal_zone0/temp"; static constexpr char kRootDirectory[] = "/"; }; -} // namespace panther_diagnostics -#endif // PANTHER_DIAGNOSTICS_SYSTEM_MONITOR_NODE_HPP_ +} // namespace husarion_ugv_diagnostics +#endif // HUSARION_UGV_DIAGNOSTICS_SYSTEM_MONITOR_NODE_HPP_ diff --git a/panther_diagnostics/include/panther_diagnostics/types.hpp b/husarion_ugv_diagnostics/include/husarion_ugv_diagnostics/types.hpp similarity index 82% rename from panther_diagnostics/include/panther_diagnostics/types.hpp rename to husarion_ugv_diagnostics/include/husarion_ugv_diagnostics/types.hpp index 1ed2c88c7..4108b56dc 100644 --- a/panther_diagnostics/include/panther_diagnostics/types.hpp +++ b/husarion_ugv_diagnostics/include/husarion_ugv_diagnostics/types.hpp @@ -12,12 +12,12 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_DIAGNOSTICS_TYPES_HPP_ -#define PANTHER_DIAGNOSTICS_TYPES_HPP_ +#ifndef HUSARION_UGV_DIAGNOSTICS_TYPES_HPP_ +#define HUSARION_UGV_DIAGNOSTICS_TYPES_HPP_ #include -namespace panther_diagnostics +namespace husarion_ugv_diagnostics { /** @@ -35,6 +35,6 @@ struct SystemStatus float disk_usage; }; -} // namespace panther_diagnostics +} // namespace husarion_ugv_diagnostics -#endif // PANTHER_DIAGNOSTICS_TYPES_HPP_ +#endif // HUSARION_UGV_DIAGNOSTICS_TYPES_HPP_ diff --git a/panther_diagnostics/launch/system_monitor.launch.py b/husarion_ugv_diagnostics/launch/system_monitor.launch.py similarity index 97% rename from panther_diagnostics/launch/system_monitor.launch.py rename to husarion_ugv_diagnostics/launch/system_monitor.launch.py index e2d2ab706..34a82815f 100644 --- a/panther_diagnostics/launch/system_monitor.launch.py +++ b/husarion_ugv_diagnostics/launch/system_monitor.launch.py @@ -29,7 +29,7 @@ def generate_launch_description(): ) system_monitor_node = Node( - package="panther_diagnostics", + package="husarion_ugv_diagnostics", executable="system_monitor_node", name="system_monitor", namespace=namespace, diff --git a/panther_diagnostics/package.xml b/husarion_ugv_diagnostics/package.xml similarity index 87% rename from panther_diagnostics/package.xml rename to husarion_ugv_diagnostics/package.xml index 9f827b6d8..fe6258e05 100644 --- a/panther_diagnostics/package.xml +++ b/husarion_ugv_diagnostics/package.xml @@ -1,9 +1,9 @@ - panther_diagnostics + husarion_ugv_diagnostics 2.1.1 - Package for diagnosting usage of OS on the Panther Robot + Package for diagnosting usage of OS on the Husarion UGV robot Husarion Apache License 2.0 @@ -20,8 +20,8 @@ diagnostic_msgs diagnostic_updater generate_parameter_library + husarion_ugv_utils panther_msgs - panther_utils rclcpp std_msgs diff --git a/panther_diagnostics/src/main.cpp b/husarion_ugv_diagnostics/src/main.cpp similarity index 80% rename from panther_diagnostics/src/main.cpp rename to husarion_ugv_diagnostics/src/main.cpp index 8d09517f6..61cb38cca 100644 --- a/panther_diagnostics/src/main.cpp +++ b/husarion_ugv_diagnostics/src/main.cpp @@ -18,15 +18,15 @@ #include -#include "panther_diagnostics/filesystem.hpp" -#include "panther_diagnostics/system_monitor_node.hpp" +#include "husarion_ugv_diagnostics/filesystem.hpp" +#include "husarion_ugv_diagnostics/system_monitor_node.hpp" int main(int argc, char ** argv) { rclcpp::init(argc, argv); - auto filesystem = std::make_shared(); - auto system_monitor_node = std::make_shared( + auto filesystem = std::make_shared(); + auto system_monitor_node = std::make_shared( "system_monitor", filesystem); try { diff --git a/panther_diagnostics/src/system_monitor_node.cpp b/husarion_ugv_diagnostics/src/system_monitor_node.cpp similarity index 89% rename from panther_diagnostics/src/system_monitor_node.cpp rename to husarion_ugv_diagnostics/src/system_monitor_node.cpp index bc921a75d..f25bcbe3e 100644 --- a/panther_diagnostics/src/system_monitor_node.cpp +++ b/husarion_ugv_diagnostics/src/system_monitor_node.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_diagnostics/system_monitor_node.hpp" +#include "husarion_ugv_diagnostics/system_monitor_node.hpp" #include #include @@ -24,13 +24,13 @@ #include "panther_msgs/msg/system_status.hpp" -#include "panther_utils/common_utilities.hpp" -#include "panther_utils/ros_utils.hpp" +#include "husarion_ugv_utils/common_utilities.hpp" +#include "husarion_ugv_utils/ros_utils.hpp" -#include "panther_diagnostics/filesystem.hpp" -#include "panther_diagnostics/types.hpp" +#include "husarion_ugv_diagnostics/filesystem.hpp" +#include "husarion_ugv_diagnostics/types.hpp" -namespace panther_diagnostics +namespace husarion_ugv_diagnostics { SystemMonitorNode::SystemMonitorNode( @@ -101,7 +101,7 @@ float SystemMonitorNode::GetCPUMeanUsage(const std::vector & usages) cons }); auto sum = std::accumulate(usages.begin(), usages.end(), 0.0); - auto mean_usage = panther_utils::common_utilities::SetPrecision(sum / usages.size(), 2); + auto mean_usage = husarion_ugv_utils::common_utilities::SetPrecision(sum / usages.size(), 2); return mean_usage; } @@ -112,7 +112,7 @@ float SystemMonitorNode::GetCPUTemperature() const try { const auto temperature_str = filesystem_->ReadFile(kTemperatureInfoFilename); - temperature = panther_utils::common_utilities::SetPrecision( + temperature = husarion_ugv_utils::common_utilities::SetPrecision( std::stof(temperature_str) / 1000.0, 2); } catch (const std::exception & e) { RCLCPP_ERROR_STREAM( @@ -127,7 +127,8 @@ float SystemMonitorNode::GetRAMUsage() const int total = 0, free = 0, available = 0; uprofile::getSystemMemory(total, available, free); - const auto ram_usage = panther_utils::common_utilities::CountPercentage(total - available, total); + const auto ram_usage = husarion_ugv_utils::common_utilities::CountPercentage( + total - available, total); return ram_usage; } @@ -138,7 +139,8 @@ float SystemMonitorNode::GetDiskUsage() const try { const auto capacity = filesystem_->GetSpaceCapacity(kRootDirectory); const auto available = filesystem_->GetSpaceAvailable(kRootDirectory); - disk_usage = panther_utils::common_utilities::CountPercentage(capacity - available, capacity); + disk_usage = husarion_ugv_utils::common_utilities::CountPercentage( + capacity - available, capacity); } catch (const std::exception & e) { RCLCPP_ERROR_STREAM( this->get_logger(), "An exception occurred while reading disk usage: " << e.what()); @@ -196,4 +198,4 @@ void SystemMonitorNode::DiagnoseSystem(diagnostic_updater::DiagnosticStatusWrapp status.summary(error_level, message); } -} // namespace panther_diagnostics +} // namespace husarion_ugv_diagnostics diff --git a/panther_diagnostics/test/integration/system_monitor_node.test.py b/husarion_ugv_diagnostics/test/integration/system_monitor_node.test.py similarity index 97% rename from panther_diagnostics/test/integration/system_monitor_node.test.py rename to husarion_ugv_diagnostics/test/integration/system_monitor_node.test.py index dc895713f..53b34bd49 100644 --- a/panther_diagnostics/test/integration/system_monitor_node.test.py +++ b/husarion_ugv_diagnostics/test/integration/system_monitor_node.test.py @@ -30,7 +30,7 @@ def generate_test_description(): system_monitor_node = Node( - package="panther_diagnostics", + package="husarion_ugv_diagnostics", executable="system_monitor_node", ) diff --git a/panther_diagnostics/test/unit/test_filesystem.cpp b/husarion_ugv_diagnostics/test/unit/test_filesystem.cpp similarity index 91% rename from panther_diagnostics/test/unit/test_filesystem.cpp rename to husarion_ugv_diagnostics/test/unit/test_filesystem.cpp index 3e9c87553..24f7a6540 100644 --- a/panther_diagnostics/test/unit/test_filesystem.cpp +++ b/husarion_ugv_diagnostics/test/unit/test_filesystem.cpp @@ -18,7 +18,7 @@ #include #include -#include "panther_diagnostics/filesystem.hpp" +#include "husarion_ugv_diagnostics/filesystem.hpp" class TestFilesystem : public testing::Test { @@ -29,12 +29,13 @@ class TestFilesystem : public testing::Test void RemoveTestFile(const std::string & file_path); protected: - std::shared_ptr filesystem_; + std::shared_ptr filesystem_; static constexpr char kDummyString[] = "Hello World!"; }; -TestFilesystem::TestFilesystem() : filesystem_(std::make_shared()) +TestFilesystem::TestFilesystem() +: filesystem_(std::make_shared()) { } diff --git a/panther_diagnostics/test/unit/test_system_monitor_node.cpp b/husarion_ugv_diagnostics/test/unit/test_system_monitor_node.cpp similarity index 83% rename from panther_diagnostics/test/unit/test_system_monitor_node.cpp rename to husarion_ugv_diagnostics/test/unit/test_system_monitor_node.cpp index 8c93ff248..dd6ad0538 100644 --- a/panther_diagnostics/test/unit/test_system_monitor_node.cpp +++ b/husarion_ugv_diagnostics/test/unit/test_system_monitor_node.cpp @@ -20,10 +20,10 @@ #include #include -#include "panther_diagnostics/filesystem.hpp" -#include "panther_diagnostics/system_monitor_node.hpp" +#include "husarion_ugv_diagnostics/filesystem.hpp" +#include "husarion_ugv_diagnostics/system_monitor_node.hpp" -class MockFilesystem : public panther_diagnostics::FilesystemInterface +class MockFilesystem : public husarion_ugv_diagnostics::FilesystemInterface { public: MOCK_METHOD( @@ -35,38 +35,38 @@ class MockFilesystem : public panther_diagnostics::FilesystemInterface MOCK_METHOD(std::string, ReadFile, (const std::string & file_path), (const, override)); }; -class SystemMonitorNodeWrapper : public panther_diagnostics::SystemMonitorNode +class SystemMonitorNodeWrapper : public husarion_ugv_diagnostics::SystemMonitorNode { public: SystemMonitorNodeWrapper(std::shared_ptr filesystem) - : panther_diagnostics::SystemMonitorNode("test_system_statics", filesystem) + : husarion_ugv_diagnostics::SystemMonitorNode("test_system_statics", filesystem) { } std::vector GetCoresUsages() const { - return panther_diagnostics::SystemMonitorNode::GetCoresUsages(); + return husarion_ugv_diagnostics::SystemMonitorNode::GetCoresUsages(); } float GetCPUMeanUsage(const std::vector & usages) const { - return panther_diagnostics::SystemMonitorNode::GetCPUMeanUsage(usages); + return husarion_ugv_diagnostics::SystemMonitorNode::GetCPUMeanUsage(usages); } float GetCPUTemperature() const { - return panther_diagnostics::SystemMonitorNode::GetCPUTemperature(); + return husarion_ugv_diagnostics::SystemMonitorNode::GetCPUTemperature(); } - float GetRAMUsage() const { return panther_diagnostics::SystemMonitorNode::GetRAMUsage(); } + float GetRAMUsage() const { return husarion_ugv_diagnostics::SystemMonitorNode::GetRAMUsage(); } - float GetDiskUsage() const { return panther_diagnostics::SystemMonitorNode::GetDiskUsage(); } + float GetDiskUsage() const { return husarion_ugv_diagnostics::SystemMonitorNode::GetDiskUsage(); } panther_msgs::msg::SystemStatus SystemStatusToMessage( - const panther_diagnostics::SystemStatus & status) + const husarion_ugv_diagnostics::SystemStatus & status) { - return panther_diagnostics::SystemMonitorNode::SystemStatusToMessage(status); + return husarion_ugv_diagnostics::SystemMonitorNode::SystemStatusToMessage(status); } }; @@ -160,7 +160,7 @@ TEST_F(TestSystemMonitorNode, GetDiskUsageInvalidFilesystem) TEST_F(TestSystemMonitorNode, SystemStatusToMessage) { - panther_diagnostics::SystemStatus test_status; + husarion_ugv_diagnostics::SystemStatus test_status; test_status.core_usages = {50.0, 50.0, 50.0}; test_status.cpu_mean_usage = 50.0; test_status.cpu_temperature = 36.6; diff --git a/panther_gazebo/CHANGELOG.rst b/husarion_ugv_gazebo/CHANGELOG.rst similarity index 100% rename from panther_gazebo/CHANGELOG.rst rename to husarion_ugv_gazebo/CHANGELOG.rst diff --git a/panther_gazebo/CMakeLists.txt b/husarion_ugv_gazebo/CMakeLists.txt similarity index 82% rename from panther_gazebo/CMakeLists.txt rename to husarion_ugv_gazebo/CMakeLists.txt index cae0aaa39..ae06fd9c3 100644 --- a/panther_gazebo/CMakeLists.txt +++ b/husarion_ugv_gazebo/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.10.2) -project(panther_gazebo) +project(husarion_ugv_gazebo) if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options(-Wall -Wextra -Wpedantic) @@ -28,21 +28,21 @@ find_package(Qt5 REQUIRED COMPONENTS Core Quick QuickControls2) include_directories(include ${Qt5Core_INCLUDE_DIRS} ${Qt5Qml_INCLUDE_DIRS} ${Qt5Quick_INCLUDE_DIRS} ${Qt5QuickControls2_INCLUDE_DIRS}) -add_library(panther_simulation_plugins SHARED src/gz_panther_system.cpp) +add_library(estop_system_plugins SHARED src/estop_system.cpp) ament_target_dependencies( - panther_simulation_plugins + estop_system_plugins hardware_interface ign_ros2_control rclcpp rclcpp_lifecycle std_msgs std_srvs) -target_link_libraries(panther_simulation_plugins ignition-gazebo6) +target_link_libraries(estop_system_plugins ignition-gazebo6) set(CMAKE_AUTOMOC ON) qt5_add_resources(resources_rcc src/gui/EStop.qrc) -add_library(EStop SHARED include/panther_gazebo/gui/e_stop.hpp +add_library(EStop SHARED include/husarion_ugv_gazebo/gui/e_stop.hpp src/gui/e_stop.cpp ${resources_rcc}) ament_target_dependencies(EStop rclcpp std_srvs) target_link_libraries( @@ -60,7 +60,7 @@ target_link_libraries(LEDStrip ignition-gazebo6 ignition-msgs8 ignition-plugin1 ignition-transport11) install( - TARGETS panther_simulation_plugins + TARGETS estop_system_plugins RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib) @@ -86,8 +86,7 @@ endif() ament_export_include_directories(include) -pluginlib_export_plugin_description_file(ign_ros2_control - panther_simulation_plugins.xml) +pluginlib_export_plugin_description_file(ign_ros2_control plugins.xml) ament_environment_hooks( "${CMAKE_CURRENT_SOURCE_DIR}/hooks/${PROJECT_NAME}.sh.in") diff --git a/panther_gazebo/CONFIGURATION.md b/husarion_ugv_gazebo/CONFIGURATION.md similarity index 71% rename from panther_gazebo/CONFIGURATION.md rename to husarion_ugv_gazebo/CONFIGURATION.md index d83baf523..3ad174b36 100644 --- a/panther_gazebo/CONFIGURATION.md +++ b/husarion_ugv_gazebo/CONFIGURATION.md @@ -1,8 +1,8 @@ -# panther_gazebo +# husarion_ugv_gazebo ## Use of GPS in Simulation -The NavSat system is utilized to publish the Panther robot's position within the Gazebo world. It manages navigation satellite sensors, such as GPS, which report position and velocity in spherical coordinates (latitude/longitude) through Ignition Transport. +The NavSat system is utilized to publish the robot's position within the Gazebo world. It manages navigation satellite sensors, such as GPS, which report position and velocity in spherical coordinates (latitude/longitude) through Ignition Transport. The NavSat sensors requires the spherical coordinates of the world origin to be configured. This configuration can be accomplished, for instance, by employing the `` tag within the world's SDF or by utilizing the Ignition `/world/world_name/set_spherical_coordinates` service. @@ -33,12 +33,12 @@ To obtain GPS data in Ignition, follow these steps: ## Linear Battery Plugin -It is possible to simulate the battery operation of the Panther robot. By default, this feature is disabled, but you can enable it by setting the `simulate_discharging` parameter to `true` in the `battery_plugin.yaml` file or in the file pointed to by the `battery_config_path` parameter. Below, you will find the plugin parameters that enable battery simulation. +It is possible to simulate the battery operation of the simulated robot. By default, this feature is disabled, but you can enable it by setting the `simulate_discharging` parameter to `true` in the `battery_plugin.yaml` file or in the file pointed to by the `battery_config_path` parameter. Below, you will find the plugin parameters that enable battery simulation. - `simulate_discharging` [*bool*, default: **false**]: Enables battery simulation. If set to `true`, the battery will discharge **at a constant rate** (regardless of joint torque), and if it depletes completely, the robot will stop moving. When set to `false`, the battery will not discharge, but the battery status information will still be published on the `battery/battery_status` topic. - `initial_charge_percentage` [*float*, default: **70.0**]: Sets the initial charge percentage of the battery. - `charging_time` [*float*, default: **6.0**]: Specifies the charging time for the battery in hours. -- `power_load` [*float*, default: **120.0**]: Represents the average power load during normal operation **[W]** and is initially set to 120.0 W. With the default power load of 120.0 W, the robot can operate for up to 8 hours. When the `simulate_discharging` parameter is set to `false`, this value defaults to 0.0 W. Users are encouraged to customize this value to match their specific requirements. For more information on Panther power consumption, please refer to [Panther Battery & Charging Documentation](https://husarion.com/manuals/panther/#battery--charging). +- `power_load` [*float*, default: **120.0**]: Represents the average power load during normal operation **[W]** and is initially set to 120.0 W. With the default power load of 120.0 W, the robot can operate for up to 8 hours. When the `simulate_discharging` parameter is set to `false`, this value defaults to 0.0 W. Users are encouraged to customize this value to match their specific requirements. For more information on robot power consumption, please refer to [Battery & Charging Documentation](https://husarion.com/manuals/panther/#battery--charging). > [!NOTE] > @@ -51,11 +51,11 @@ Unfortunately, there is no straightforward way to exchange `LinearBatteryPlugin` You can start the charging process by calling the Ignition service: ```bash -ign service --service /model/panther/battery/battery/recharge/start --reqtype ignition.msgs.Boolean --reptype ignition.msgs.Empty --req '' --timeout 0 +ign service --service /model/{robot_model}/battery/battery/recharge/start --reqtype ignition.msgs.Boolean --reptype ignition.msgs.Empty --req '' --timeout 0 ``` and stop it using: ```bash -ign service --service /model/panther/battery/battery/recharge/stop --reqtype ignition.msgs.Boolean --reptype ignition.msgs.Empty --req '' --timeout 0 +ign service --service /model/{robot_model}/battery/battery/recharge/stop --reqtype ignition.msgs.Boolean --reptype ignition.msgs.Empty --req '' --timeout 0 ``` diff --git a/panther_gazebo/README.md b/husarion_ugv_gazebo/README.md similarity index 98% rename from panther_gazebo/README.md rename to husarion_ugv_gazebo/README.md index 7a8189153..3b573404b 100644 --- a/panther_gazebo/README.md +++ b/husarion_ugv_gazebo/README.md @@ -1,4 +1,4 @@ -# panther_gazebo +# husarion_ugv_gazebo The package contains a launch file and source files used to run the robot simulation in Gazebo. The simulator tries to reproduce the behavior of a real robot as much as possible, including the provision of an analogous ROS_API. @@ -26,7 +26,7 @@ The package contains a launch file and source files used to run the robot simula - `hardware/e_stop_reset` [*std_srvs/Trigger*]: Resets E-stop. - `hardware/e_stop_trigger` [*std_srvs/Trigger*]: Triggers E-stop. -### GzPantherSystem +### EStopSystem Plugin based on `ign_system` is responsible for handling sensor interfaces (only IMU for now) and sending requests for joints compatible with `ros2_control`. Plugin also adds E-Stop support. diff --git a/panther_gazebo/config/battery_plugin.yaml b/husarion_ugv_gazebo/config/battery_plugin.yaml similarity index 82% rename from panther_gazebo/config/battery_plugin.yaml rename to husarion_ugv_gazebo/config/battery_plugin.yaml index 45eaac5ed..2564ebc3d 100644 --- a/panther_gazebo/config/battery_plugin.yaml +++ b/husarion_ugv_gazebo/config/battery_plugin.yaml @@ -1,6 +1,6 @@ # Parameters for the Gazebo LinearBatteryPlugin -# For more information on Panther power consumption, please refer to: -# https://husarion.com/manuals/panther/#battery--charging +# For more information on robots power consumption, please refer to: +# Panther: https://husarion.com/manuals/panther/#battery--charging # If set to true, the battery will discharge and if it depletes completely, the robot will stop moving. simulate_discharging: false diff --git a/panther_gazebo/config/gz_bridge.yaml b/husarion_ugv_gazebo/config/gz_bridge.yaml similarity index 100% rename from panther_gazebo/config/gz_bridge.yaml rename to husarion_ugv_gazebo/config/gz_bridge.yaml diff --git a/panther_gazebo/config/teleop_with_estop.config b/husarion_ugv_gazebo/config/teleop_with_estop.config similarity index 100% rename from panther_gazebo/config/teleop_with_estop.config rename to husarion_ugv_gazebo/config/teleop_with_estop.config diff --git a/panther_gazebo/hooks/panther_gazebo.sh.in b/husarion_ugv_gazebo/hooks/husarion_ugv_gazebo.sh.in similarity index 100% rename from panther_gazebo/hooks/panther_gazebo.sh.in rename to husarion_ugv_gazebo/hooks/husarion_ugv_gazebo.sh.in diff --git a/panther_gazebo/include/panther_gazebo/gz_panther_system.hpp b/husarion_ugv_gazebo/include/husarion_ugv_gazebo/estop_system.hpp similarity index 90% rename from panther_gazebo/include/panther_gazebo/gz_panther_system.hpp rename to husarion_ugv_gazebo/include/husarion_ugv_gazebo/estop_system.hpp index 6978fa716..3cb4742bc 100644 --- a/panther_gazebo/include/panther_gazebo/gz_panther_system.hpp +++ b/husarion_ugv_gazebo/include/husarion_ugv_gazebo/estop_system.hpp @@ -13,8 +13,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_GAZEBO_GZ_PANTHER_SYSTEM -#define PANTHER_GAZEBO_GZ_PANTHER_SYSTEM +#ifndef HUSARION_UGV_GAZEBO_ESTOP_SYSTEM +#define HUSARION_UGV_GAZEBO_ESTOP_SYSTEM #include @@ -27,7 +27,7 @@ #include #include -namespace panther_gazebo +namespace husarion_ugv_gazebo { using CallbackReturn = rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn; using BoolMsg = std_msgs::msg::Bool; @@ -38,7 +38,7 @@ using TriggerSrv = std_srvs::srv::Trigger; * `hardware_interface::SystemInterface`. This class inherits `ign_ros2_control::IgnitionSystem` * and implements additional functionalities like E-stop handling. */ -class GzPantherSystem : public ign_ros2_control::IgnitionSystem +class EStopSystem : public ign_ros2_control::IgnitionSystem { public: CallbackReturn on_init(const hardware_interface::HardwareInfo & system_info) override; @@ -69,6 +69,6 @@ class GzPantherSystem : public ign_ros2_control::IgnitionSystem rclcpp::Service::SharedPtr e_stop_trigger_service_; }; -} // namespace panther_gazebo +} // namespace husarion_ugv_gazebo -#endif // PANTHER_GAZEBO_GZ_PANTHER_SYSTEM +#endif // HUSARION_UGV_GAZEBO_ESTOP_SYSTEM diff --git a/panther_gazebo/include/panther_gazebo/gui/e_stop.hpp b/husarion_ugv_gazebo/include/husarion_ugv_gazebo/gui/e_stop.hpp similarity index 89% rename from panther_gazebo/include/panther_gazebo/gui/e_stop.hpp rename to husarion_ugv_gazebo/include/husarion_ugv_gazebo/gui/e_stop.hpp index 055db7e16..962f5b207 100644 --- a/panther_gazebo/include/panther_gazebo/gui/e_stop.hpp +++ b/husarion_ugv_gazebo/include/husarion_ugv_gazebo/gui/e_stop.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_GAZEBO_GUI_E_STOP_HPP_ -#define PANTHER_GAZEBO_GUI_E_STOP_HPP_ +#ifndef HUSARION_UGV_GAZEBO_GUI_E_STOP_HPP_ +#define HUSARION_UGV_GAZEBO_GUI_E_STOP_HPP_ #include @@ -23,7 +23,7 @@ #include -namespace panther_gazebo +namespace husarion_ugv_gazebo { class EStop : public ignition::gui::Plugin @@ -59,6 +59,6 @@ protected slots: rclcpp::Client::SharedPtr e_stop_reset_client_; rclcpp::Client::SharedPtr e_stop_trigger_client_; }; -} // namespace panther_gazebo +} // namespace husarion_ugv_gazebo -#endif // PANTHER_GAZEBO_GUI_E_STOP_HPP_ +#endif // HUSARION_UGV_GAZEBO_GUI_E_STOP_HPP_ diff --git a/panther_gazebo/include/panther_gazebo/led_strip.hpp b/husarion_ugv_gazebo/include/husarion_ugv_gazebo/led_strip.hpp similarity index 96% rename from panther_gazebo/include/panther_gazebo/led_strip.hpp rename to husarion_ugv_gazebo/include/husarion_ugv_gazebo/led_strip.hpp index 0f0945ea6..74d764449 100644 --- a/panther_gazebo/include/panther_gazebo/led_strip.hpp +++ b/husarion_ugv_gazebo/include/husarion_ugv_gazebo/led_strip.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_GAZEBO_LED_STRIP_HPP_ -#define PANTHER_GAZEBO_LED_STRIP_HPP_ +#ifndef HUSARION_UGV_GAZEBO_LED_STRIP_HPP_ +#define HUSARION_UGV_GAZEBO_LED_STRIP_HPP_ #include #include @@ -33,7 +33,7 @@ #include #include -namespace panther_gazebo +namespace husarion_ugv_gazebo { /** @@ -144,6 +144,6 @@ class LEDStrip : public gz::sim::System, 1)}; // Avoid initialization errors when the robot is not yet spawned on the scene. }; -} // namespace panther_gazebo +} // namespace husarion_ugv_gazebo -#endif // PANTHER_GAZEBO_LED_STRIP_HPP_ +#endif // HUSARION_UGV_GAZEBO_LED_STRIP_HPP_ diff --git a/panther_gazebo/launch/simulate_robot.launch.py b/husarion_ugv_gazebo/launch/simulate_robot.launch.py similarity index 91% rename from panther_gazebo/launch/simulate_robot.launch.py rename to husarion_ugv_gazebo/launch/simulate_robot.launch.py index 2bd4f822b..22c84d2b2 100644 --- a/panther_gazebo/launch/simulate_robot.launch.py +++ b/husarion_ugv_gazebo/launch/simulate_robot.launch.py @@ -51,7 +51,7 @@ def generate_launch_description(): "This configuration is intended for use in simulations only." ), default_value=PathJoinSubstitution( - [FindPackageShare("panther_gazebo"), "config", "battery_plugin.yaml"] + [FindPackageShare("husarion_ugv_gazebo"), "config", "battery_plugin.yaml"] ), ) @@ -65,8 +65,8 @@ def generate_launch_description(): ), description=( "Additional components configuration file. Components described in this file " - "are dynamically included in Panther's urdf." - "Panther options are described here " + "are dynamically included in robot's URDF." + "Available options are described in the manual: " "https://husarion.com/manuals/panther/panther-options/" ), ) @@ -75,7 +75,7 @@ def generate_launch_description(): declare_gz_bridge_config_path_arg = DeclareLaunchArgument( "gz_bridge_config_path", default_value=PathJoinSubstitution( - [FindPackageShare("panther_gazebo"), "config", "gz_bridge.yaml"] + [FindPackageShare("husarion_ugv_gazebo"), "config", "gz_bridge.yaml"] ), description="Path to the parameter_bridge configuration file.", ) @@ -107,7 +107,7 @@ def generate_launch_description(): spawn_robot_launch = IncludeLaunchDescription( PythonLaunchDescriptionSource( PathJoinSubstitution( - [FindPackageShare("panther_gazebo"), "launch", "spawn_robot.launch.py"] + [FindPackageShare("husarion_ugv_gazebo"), "launch", "spawn_robot.launch.py"] ) ), launch_arguments={ @@ -119,7 +119,7 @@ def generate_launch_description(): lights_launch = IncludeLaunchDescription( PythonLaunchDescriptionSource( PathJoinSubstitution( - [FindPackageShare("panther_lights"), "launch", "lights.launch.py"] + [FindPackageShare("husarion_ugv_lights"), "launch", "lights.launch.py"] ) ), launch_arguments={"namespace": namespace, "use_sim": "True"}.items(), @@ -128,7 +128,7 @@ def generate_launch_description(): manager_launch = IncludeLaunchDescription( PythonLaunchDescriptionSource( PathJoinSubstitution( - [FindPackageShare("panther_manager"), "launch", "manager.launch.py"] + [FindPackageShare("husarion_ugv_manager"), "launch", "manager.launch.py"] ) ), launch_arguments={"namespace": namespace, "use_sim": "True"}.items(), @@ -138,7 +138,7 @@ def generate_launch_description(): PythonLaunchDescriptionSource( PathJoinSubstitution( [ - FindPackageShare("panther_controller"), + FindPackageShare("husarion_ugv_controller"), "launch", "controller.launch.py", ] @@ -155,7 +155,7 @@ def generate_launch_description(): PythonLaunchDescriptionSource( PathJoinSubstitution( [ - FindPackageShare("panther_localization"), + FindPackageShare("husarion_ugv_localization"), "launch", "localization.launch.py", ] @@ -192,7 +192,7 @@ def generate_launch_description(): gz_bridge = Node( package="ros_gz_bridge", executable="parameter_bridge", - name="panther_base_gz_bridge", + name="base_gz_bridge", parameters=[{"config_file": namespaced_gz_bridge_config_path}], namespace=namespace, emulate_tty=True, diff --git a/panther_gazebo/launch/simulation.launch.py b/husarion_ugv_gazebo/launch/simulation.launch.py similarity index 94% rename from panther_gazebo/launch/simulation.launch.py rename to husarion_ugv_gazebo/launch/simulation.launch.py index 5ea187207..cf2e78de3 100644 --- a/panther_gazebo/launch/simulation.launch.py +++ b/husarion_ugv_gazebo/launch/simulation.launch.py @@ -33,7 +33,7 @@ def generate_launch_description(): declare_gz_gui = DeclareLaunchArgument( "gz_gui", default_value=PathJoinSubstitution( - [FindPackageShare("panther_gazebo"), "config", "teleop_with_estop.config"] + [FindPackageShare("husarion_ugv_gazebo"), "config", "teleop_with_estop.config"] ), description="Run simulation with specific GUI layout.", ) @@ -63,7 +63,7 @@ def generate_launch_description(): PythonLaunchDescriptionSource( PathJoinSubstitution( [ - FindPackageShare("panther_gazebo"), + FindPackageShare("husarion_ugv_gazebo"), "launch", "simulate_robot.launch.py", ] diff --git a/panther_gazebo/launch/spawn_robot.launch.py b/husarion_ugv_gazebo/launch/spawn_robot.launch.py similarity index 98% rename from panther_gazebo/launch/spawn_robot.launch.py rename to husarion_ugv_gazebo/launch/spawn_robot.launch.py index 624586ba4..39a47a2cb 100644 --- a/panther_gazebo/launch/spawn_robot.launch.py +++ b/husarion_ugv_gazebo/launch/spawn_robot.launch.py @@ -16,6 +16,7 @@ import os +from husarion_ugv_utils.messages import welcome_msg from launch import LaunchDescription from launch.actions import DeclareLaunchArgument, IncludeLaunchDescription from launch.launch_description_sources import PythonLaunchDescriptionSource @@ -27,7 +28,6 @@ ) from launch_ros.actions import Node, SetUseSimTime from launch_ros.substitutions import FindPackageShare -from panther_utils.messages import welcome_msg def generate_launch_description(): diff --git a/panther_gazebo/package.xml b/husarion_ugv_gazebo/package.xml similarity index 93% rename from panther_gazebo/package.xml rename to husarion_ugv_gazebo/package.xml index faa23cdd3..186f663b7 100644 --- a/panther_gazebo/package.xml +++ b/husarion_ugv_gazebo/package.xml @@ -1,7 +1,7 @@ - panther_gazebo + husarion_ugv_gazebo 2.1.1 The panther_description package Husarion @@ -29,16 +29,16 @@ controller_manager husarion_gz_worlds + husarion_ugv_controller + husarion_ugv_lights + husarion_ugv_localization + husarion_ugv_manager + husarion_ugv_utils launch launch_ros lynx_description nav2_common - panther_controller panther_description - panther_lights - panther_localization - panther_manager - panther_utils robot_state_publisher ros_components_description ros_gz_bridge diff --git a/panther_gazebo/panther_simulation_plugins.xml b/husarion_ugv_gazebo/plugins.xml similarity index 62% rename from panther_gazebo/panther_simulation_plugins.xml rename to husarion_ugv_gazebo/plugins.xml index 7a0aef76c..e25a8bce3 100644 --- a/panther_gazebo/panther_simulation_plugins.xml +++ b/husarion_ugv_gazebo/plugins.xml @@ -1,7 +1,7 @@ - + Control joints position with E-Stop functionalities in Gazebo using ROS2. diff --git a/panther_gazebo/src/gz_panther_system.cpp b/husarion_ugv_gazebo/src/estop_system.cpp similarity index 82% rename from panther_gazebo/src/gz_panther_system.cpp rename to husarion_ugv_gazebo/src/estop_system.cpp index d705d716e..4f37923f9 100644 --- a/panther_gazebo/src/gz_panther_system.cpp +++ b/husarion_ugv_gazebo/src/estop_system.cpp @@ -28,7 +28,7 @@ #include #include -#include "panther_gazebo/gz_panther_system.hpp" +#include "husarion_ugv_gazebo/estop_system.hpp" struct jointData { @@ -94,10 +94,10 @@ class ign_ros2_control::IgnitionSystemPrivate double position_proportional_gain_; }; -namespace panther_gazebo +namespace husarion_ugv_gazebo { -CallbackReturn GzPantherSystem::on_init(const hardware_interface::HardwareInfo & system_info) +CallbackReturn EStopSystem::on_init(const hardware_interface::HardwareInfo & system_info) { if (hardware_interface::SystemInterface::on_init(system_info) != CallbackReturn::SUCCESS) { return CallbackReturn::ERROR; @@ -108,24 +108,24 @@ CallbackReturn GzPantherSystem::on_init(const hardware_interface::HardwareInfo & return CallbackReturn::SUCCESS; } -CallbackReturn GzPantherSystem::on_configure(const rclcpp_lifecycle::State & previous_state) +CallbackReturn EStopSystem::on_configure(const rclcpp_lifecycle::State & previous_state) { SetupEStop(); return hardware_interface::SystemInterface::on_configure(previous_state); } -CallbackReturn GzPantherSystem::on_activate(const rclcpp_lifecycle::State & previous_state) +CallbackReturn EStopSystem::on_activate(const rclcpp_lifecycle::State & previous_state) { PublishEStopStatus(); return hardware_interface::SystemInterface::on_activate(previous_state); } -CallbackReturn GzPantherSystem::on_deactivate(const rclcpp_lifecycle::State & previous_state) +CallbackReturn EStopSystem::on_deactivate(const rclcpp_lifecycle::State & previous_state) { return hardware_interface::SystemInterface::on_deactivate(previous_state); } -hardware_interface::return_type GzPantherSystem::write( +hardware_interface::return_type EStopSystem::write( const rclcpp::Time & time, const rclcpp::Duration & period) { if (e_stop_active_) { @@ -135,7 +135,7 @@ hardware_interface::return_type GzPantherSystem::write( return IgnitionSystem::write(time, period); } -void GzPantherSystem::SetupEStop() +void EStopSystem::SetupEStop() { e_stop_publisher_ = nh_->create_publisher( "~/e_stop", rclcpp::QoS(rclcpp::KeepLast(1)).transient_local().reliable()); @@ -143,22 +143,22 @@ void GzPantherSystem::SetupEStop() e_stop_reset_service_ = nh_->create_service( "~/e_stop_reset", std::bind( - &GzPantherSystem::EStopResetCallback, this, std::placeholders::_1, std::placeholders::_2)); + &EStopSystem::EStopResetCallback, this, std::placeholders::_1, std::placeholders::_2)); e_stop_trigger_service_ = nh_->create_service( "~/e_stop_trigger", std::bind( - &GzPantherSystem::EStopTriggerCallback, this, std::placeholders::_1, std::placeholders::_2)); + &EStopSystem::EStopTriggerCallback, this, std::placeholders::_1, std::placeholders::_2)); } -void GzPantherSystem::PublishEStopStatus() +void EStopSystem::PublishEStopStatus() { std_msgs::msg::Bool e_stop_msg; e_stop_msg.data = e_stop_active_; e_stop_publisher_->publish(e_stop_msg); } -void GzPantherSystem::EStopResetCallback( +void EStopSystem::EStopResetCallback( const TriggerSrv::Request::SharedPtr & /*request*/, TriggerSrv::Response::SharedPtr response) { e_stop_active_ = false; @@ -167,7 +167,7 @@ void GzPantherSystem::EStopResetCallback( PublishEStopStatus(); } -void GzPantherSystem::EStopTriggerCallback( +void EStopSystem::EStopTriggerCallback( const TriggerSrv::Request::SharedPtr & /*request*/, TriggerSrv::Response::SharedPtr response) { e_stop_active_ = true; @@ -176,7 +176,7 @@ void GzPantherSystem::EStopTriggerCallback( PublishEStopStatus(); } -} // namespace panther_gazebo +} // namespace husarion_ugv_gazebo #include "pluginlib/class_list_macros.hpp" // NOLINT -PLUGINLIB_EXPORT_CLASS(panther_gazebo::GzPantherSystem, ign_ros2_control::IgnitionSystemInterface) +PLUGINLIB_EXPORT_CLASS(husarion_ugv_gazebo::EStopSystem, ign_ros2_control::IgnitionSystemInterface) diff --git a/panther_gazebo/src/gui/EStop.qml b/husarion_ugv_gazebo/src/gui/EStop.qml similarity index 100% rename from panther_gazebo/src/gui/EStop.qml rename to husarion_ugv_gazebo/src/gui/EStop.qml diff --git a/panther_gazebo/src/gui/EStop.qrc b/husarion_ugv_gazebo/src/gui/EStop.qrc similarity index 100% rename from panther_gazebo/src/gui/EStop.qrc rename to husarion_ugv_gazebo/src/gui/EStop.qrc diff --git a/panther_gazebo/src/gui/e_stop.cpp b/husarion_ugv_gazebo/src/gui/e_stop.cpp similarity index 94% rename from panther_gazebo/src/gui/e_stop.cpp rename to husarion_ugv_gazebo/src/gui/e_stop.cpp index ff4c30102..ffad684dd 100644 --- a/panther_gazebo/src/gui/e_stop.cpp +++ b/husarion_ugv_gazebo/src/gui/e_stop.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_gazebo/gui/e_stop.hpp" +#include "husarion_ugv_gazebo/gui/e_stop.hpp" #include @@ -23,7 +23,7 @@ #include -namespace panther_gazebo +namespace husarion_ugv_gazebo { EStop::EStop() : ignition::gui::Plugin() { rclcpp::init(0, nullptr); } @@ -90,6 +90,6 @@ void EStop::SetNamespace(const QString & ns) ignmsg << "Changed namespace to: " << namespace_ << std::endl; } -} // namespace panther_gazebo +} // namespace husarion_ugv_gazebo -IGNITION_ADD_PLUGIN(panther_gazebo::EStop, ignition::gui::Plugin) +IGNITION_ADD_PLUGIN(husarion_ugv_gazebo::EStop, ignition::gui::Plugin) diff --git a/panther_gazebo/src/led_strip.cpp b/husarion_ugv_gazebo/src/led_strip.cpp similarity index 97% rename from panther_gazebo/src/led_strip.cpp rename to husarion_ugv_gazebo/src/led_strip.cpp index c7820bb1f..c0984620c 100644 --- a/panther_gazebo/src/led_strip.cpp +++ b/husarion_ugv_gazebo/src/led_strip.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_gazebo/led_strip.hpp" +#include "husarion_ugv_gazebo/led_strip.hpp" #include #include @@ -25,7 +25,7 @@ #include #include -namespace panther_gazebo +namespace husarion_ugv_gazebo { void LEDStrip::Configure( const gz::sim::Entity & entity, const std::shared_ptr & sdf, @@ -275,8 +275,8 @@ void LEDStrip::CreateMarker( node_.Request("/marker", marker_msg); } -} // namespace panther_gazebo +} // namespace husarion_ugv_gazebo IGNITION_ADD_PLUGIN( - panther_gazebo::LEDStrip, gz::sim::System, panther_gazebo::LEDStrip::ISystemConfigure, - panther_gazebo::LEDStrip::ISystemPreUpdate) + husarion_ugv_gazebo::LEDStrip, gz::sim::System, husarion_ugv_gazebo::LEDStrip::ISystemConfigure, + husarion_ugv_gazebo::LEDStrip::ISystemPreUpdate) diff --git a/panther_hardware_interfaces/CHANGELOG.rst b/husarion_ugv_hardware_interfaces/CHANGELOG.rst similarity index 100% rename from panther_hardware_interfaces/CHANGELOG.rst rename to husarion_ugv_hardware_interfaces/CHANGELOG.rst diff --git a/panther_hardware_interfaces/CMakeLists.txt b/husarion_ugv_hardware_interfaces/CMakeLists.txt similarity index 93% rename from panther_hardware_interfaces/CMakeLists.txt rename to husarion_ugv_hardware_interfaces/CMakeLists.txt index 1728bd37d..2f0d65fa2 100644 --- a/panther_hardware_interfaces/CMakeLists.txt +++ b/husarion_ugv_hardware_interfaces/CMakeLists.txt @@ -8,7 +8,7 @@ if(USE_SUPERBUILD) include(cmake/SuperBuild.cmake) return() else() - project(panther_hardware_interfaces) + project(husarion_ugv_hardware_interfaces) endif() if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") @@ -24,7 +24,7 @@ set(PACKAGE_DEPENDENCIES hardware_interface imu_filter_madgwick panther_msgs - panther_utils + husarion_ugv_utils phidgets_api PkgConfig pluginlib @@ -72,11 +72,11 @@ ament_target_dependencies(${PROJECT_NAME} ${PACKAGE_DEPENDENCIES}) target_link_libraries(${PROJECT_NAME} PkgConfig::LIBLELY_COAPP PkgConfig::LIBGPIOD phidgets_spatial_parameters) -target_compile_definitions(${PROJECT_NAME} - PRIVATE "PANTHER_HARDWARE_INTERFACES_BUILDING_DLL") +target_compile_definitions( + ${PROJECT_NAME} PRIVATE "HUSARION_UGV_HARDWARE_INTERFACES_BUILDING_DLL") pluginlib_export_plugin_description_file(hardware_interface - panther_hardware_interfaces.xml) + husarion_ugv_hardware_interfaces.xml) install( TARGETS ${PROJECT_NAME} @@ -90,7 +90,7 @@ if(BUILD_TESTING) find_package(ament_cmake_gtest REQUIRED) find_package(ament_cmake_gmock REQUIRED) find_package(ros_testing REQUIRED) - find_package(panther_utils REQUIRED) + find_package(husarion_ugv_utils REQUIRED) install(DIRECTORY test/config DESTINATION share/${PROJECT_NAME}/test) @@ -100,7 +100,7 @@ if(BUILD_TESTING) test/panther_imu_sensor/test_panther_imu_sensor.cpp) ament_target_dependencies( ${PROJECT_NAME}_test_panther_imu_sensor hardware_interface rclcpp - panther_utils panther_msgs phidgets_api) + husarion_ugv_utils panther_msgs phidgets_api) target_link_libraries(${PROJECT_NAME}_test_panther_imu_sensor ${PROJECT_NAME} phidgets_spatial_parameters) @@ -118,7 +118,7 @@ if(BUILD_TESTING) PUBLIC $ $) ament_target_dependencies(${PROJECT_NAME}_test_roboteq_data_converters - panther_msgs panther_utils) + panther_msgs husarion_ugv_utils) target_link_libraries(${PROJECT_NAME}_test_roboteq_data_converters PkgConfig::LIBLELY_COAPP) @@ -131,7 +131,7 @@ if(BUILD_TESTING) PUBLIC $ $) ament_target_dependencies(${PROJECT_NAME}_test_canopen_manager rclcpp - panther_msgs panther_utils) + panther_msgs husarion_ugv_utils) target_link_libraries(${PROJECT_NAME}_test_canopen_manager PkgConfig::LIBLELY_COAPP) @@ -146,7 +146,7 @@ if(BUILD_TESTING) PUBLIC $ $) ament_target_dependencies(${PROJECT_NAME}_test_roboteq_driver rclcpp - panther_msgs panther_utils) + panther_msgs husarion_ugv_utils) target_link_libraries(${PROJECT_NAME}_test_roboteq_driver PkgConfig::LIBLELY_COAPP) @@ -163,7 +163,7 @@ if(BUILD_TESTING) PUBLIC $ $) ament_target_dependencies(${PROJECT_NAME}_test_roboteq_robot_driver rclcpp - panther_msgs panther_utils) + panther_msgs husarion_ugv_utils) target_link_libraries(${PROJECT_NAME}_test_roboteq_robot_driver PkgConfig::LIBLELY_COAPP) @@ -181,7 +181,7 @@ if(BUILD_TESTING) PUBLIC $ $) ament_target_dependencies(${PROJECT_NAME}_test_lynx_robot_driver rclcpp - panther_msgs panther_utils) + panther_msgs husarion_ugv_utils) target_link_libraries(${PROJECT_NAME}_test_lynx_robot_driver PkgConfig::LIBLELY_COAPP) @@ -199,7 +199,7 @@ if(BUILD_TESTING) PUBLIC $ $) ament_target_dependencies(${PROJECT_NAME}_test_panther_robot_driver rclcpp - panther_msgs panther_utils) + panther_msgs husarion_ugv_utils) target_link_libraries(${PROJECT_NAME}_test_panther_robot_driver PkgConfig::LIBLELY_COAPP) @@ -208,7 +208,8 @@ if(BUILD_TESTING) test/panther_system/gpio/test_gpio_controller.cpp src/panther_system/gpio/gpio_controller.cpp src/panther_system/gpio/gpio_driver.cpp) - ament_target_dependencies(${PROJECT_NAME}_test_gpiod_controller panther_utils) + ament_target_dependencies(${PROJECT_NAME}_test_gpiod_controller + husarion_ugv_utils) target_link_libraries(${PROJECT_NAME}_test_gpiod_controller PkgConfig::LIBGPIOD) @@ -228,7 +229,7 @@ if(BUILD_TESTING) diagnostic_updater rclcpp panther_msgs - panther_utils + husarion_ugv_utils realtime_tools std_srvs) target_link_libraries(${PROJECT_NAME}_test_system_ros_interface @@ -256,7 +257,7 @@ if(BUILD_TESTING) hardware_interface rclcpp panther_msgs - panther_utils + husarion_ugv_utils std_msgs std_srvs) target_link_libraries(${PROJECT_NAME}_test_ugv_system @@ -289,7 +290,7 @@ if(BUILD_TESTING) hardware_interface rclcpp panther_msgs - panther_utils + husarion_ugv_utils std_msgs std_srvs) target_link_libraries(${PROJECT_NAME}_test_lynx_system @@ -323,7 +324,7 @@ if(BUILD_TESTING) hardware_interface rclcpp panther_msgs - panther_utils + husarion_ugv_utils std_msgs std_srvs) target_link_libraries(${PROJECT_NAME}_test_panther_system @@ -333,7 +334,8 @@ if(BUILD_TESTING) if(TEST_INTEGRATION) # Hardware integration ament_add_gtest(${PROJECT_NAME}_test_gpiod_driver test/panther_system/gpio/test_gpio_driver.cpp) - ament_target_dependencies(${PROJECT_NAME}_test_gpiod_driver panther_utils) + ament_target_dependencies(${PROJECT_NAME}_test_gpiod_driver + husarion_ugv_utils) target_link_libraries(${PROJECT_NAME}_test_gpiod_driver ${PROJECT_NAME} PkgConfig::LIBGPIOD) endif() diff --git a/panther_hardware_interfaces/CODE_STRUCTURE.md b/husarion_ugv_hardware_interfaces/CODE_STRUCTURE.md similarity index 100% rename from panther_hardware_interfaces/CODE_STRUCTURE.md rename to husarion_ugv_hardware_interfaces/CODE_STRUCTURE.md diff --git a/panther_hardware_interfaces/README.md b/husarion_ugv_hardware_interfaces/README.md similarity index 98% rename from panther_hardware_interfaces/README.md rename to husarion_ugv_hardware_interfaces/README.md index 545dd7778..36fd86438 100644 --- a/panther_hardware_interfaces/README.md +++ b/husarion_ugv_hardware_interfaces/README.md @@ -1,4 +1,4 @@ -# panther_hardware_interfaces +# husarion_ugv_hardware_interfaces Package that implements SystemInterface from ros2_control for Panther. @@ -158,8 +158,8 @@ sudo apt install -y kmod iproute2 ### Running tests ```bash -colcon build --packages-select panther_hardware_interfaces --symlink-install -colcon test --event-handlers console_direct+ --packages-select panther_hardware_interfaces --parallel-workers 1 +colcon build --packages-select husarion_ugv_hardware_interfaces --symlink-install +colcon test --event-handlers console_direct+ --packages-select husarion_ugv_hardware_interfaces --parallel-workers 1 colcon test-result --verbose --all ``` diff --git a/panther_hardware_interfaces/cmake/SuperBuild.cmake b/husarion_ugv_hardware_interfaces/cmake/SuperBuild.cmake similarity index 98% rename from panther_hardware_interfaces/cmake/SuperBuild.cmake rename to husarion_ugv_hardware_interfaces/cmake/SuperBuild.cmake index c7fca72e8..685b8d1b4 100644 --- a/panther_hardware_interfaces/cmake/SuperBuild.cmake +++ b/husarion_ugv_hardware_interfaces/cmake/SuperBuild.cmake @@ -46,7 +46,7 @@ ExternalProject_Add( BUILD_IN_SOURCE 1) ExternalProject_Add( - ep_panther_hardware_interfaces + ep_husarion_ugv_hardware_interfaces DEPENDS ${DEPENDENCIES} SOURCE_DIR ${PROJECT_SOURCE_DIR} CMAKE_ARGS -DUSE_SUPERBUILD=OFF diff --git a/panther_hardware_interfaces/config/canopen_configuration.yaml b/husarion_ugv_hardware_interfaces/config/canopen_configuration.yaml similarity index 100% rename from panther_hardware_interfaces/config/canopen_configuration.yaml rename to husarion_ugv_hardware_interfaces/config/canopen_configuration.yaml diff --git a/panther_hardware_interfaces/config/master.dcf b/husarion_ugv_hardware_interfaces/config/master.dcf similarity index 100% rename from panther_hardware_interfaces/config/master.dcf rename to husarion_ugv_hardware_interfaces/config/master.dcf diff --git a/panther_hardware_interfaces/config/phidgets_spatial_parameters.yaml b/husarion_ugv_hardware_interfaces/config/phidgets_spatial_parameters.yaml similarity index 100% rename from panther_hardware_interfaces/config/phidgets_spatial_parameters.yaml rename to husarion_ugv_hardware_interfaces/config/phidgets_spatial_parameters.yaml diff --git a/panther_hardware_interfaces/config/roboteq_motor_controllers_v80_21a.eds b/husarion_ugv_hardware_interfaces/config/roboteq_motor_controllers_v80_21a.eds similarity index 100% rename from panther_hardware_interfaces/config/roboteq_motor_controllers_v80_21a.eds rename to husarion_ugv_hardware_interfaces/config/roboteq_motor_controllers_v80_21a.eds diff --git a/panther_hardware_interfaces/panther_hardware_interfaces.xml b/husarion_ugv_hardware_interfaces/husarion_ugv_hardware_interfaces.xml similarity index 57% rename from panther_hardware_interfaces/panther_hardware_interfaces.xml rename to husarion_ugv_hardware_interfaces/husarion_ugv_hardware_interfaces.xml index dbb3512ea..b87b15050 100644 --- a/panther_hardware_interfaces/panther_hardware_interfaces.xml +++ b/husarion_ugv_hardware_interfaces/husarion_ugv_hardware_interfaces.xml @@ -1,22 +1,22 @@ - - + Hardware system controller for Panther's Roboteq motor controller - Hardware system controller for Panther's Roboteq motor controller - Hardware IMU sensor for Panther's Phidget Spatial Inertial Measurement Unit diff --git a/panther_hardware_interfaces/include/panther_hardware_interfaces/panther_imu_sensor/panther_imu_sensor.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_imu_sensor/panther_imu_sensor.hpp similarity index 94% rename from panther_hardware_interfaces/include/panther_hardware_interfaces/panther_imu_sensor/panther_imu_sensor.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_imu_sensor/panther_imu_sensor.hpp index 5ac14ee42..640106f19 100644 --- a/panther_hardware_interfaces/include/panther_hardware_interfaces/panther_imu_sensor/panther_imu_sensor.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_imu_sensor/panther_imu_sensor.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_HARDWARE_INTERFACES_PANTHER_IMU_SENSOR_PANTHER_IMU_SENSOR_HPP_ -#define PANTHER_HARDWARE_INTERFACES_PANTHER_IMU_SENSOR_PANTHER_IMU_SENSOR_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_IMU_SENSOR_PANTHER_IMU_SENSOR_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_IMU_SENSOR_PANTHER_IMU_SENSOR_HPP_ #include #include @@ -43,7 +43,7 @@ using namespace std::placeholders; -namespace panther_hardware_interfaces +namespace husarion_ugv_hardware_interfaces { using return_type = hardware_interface::return_type; @@ -180,6 +180,6 @@ class PantherImuSensor : public hardware_interface::SensorInterface rclcpp::Time last_spatial_data_timestamp_; }; -} // namespace panther_hardware_interfaces +} // namespace husarion_ugv_hardware_interfaces -#endif // PANTHER_HARDWARE_INTERFACES_PANTHER_IMU_SENSOR_PANTHER_IMU_SENSOR_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_IMU_SENSOR_PANTHER_IMU_SENSOR_HPP_ diff --git a/panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/gpio/gpio_controller.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/gpio/gpio_controller.hpp similarity index 95% rename from panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/gpio/gpio_controller.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/gpio/gpio_controller.hpp index 53315d8fc..071b8ff03 100644 --- a/panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/gpio/gpio_controller.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/gpio/gpio_controller.hpp @@ -17,8 +17,8 @@ * @brief Header file containing a higher-level wrapper for the GPIO driver. */ -#ifndef PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_GPIO_GPIO_CONTROLLER_HPP_ -#define PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_GPIO_GPIO_CONTROLLER_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_GPIO_GPIO_CONTROLLER_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_GPIO_GPIO_CONTROLLER_HPP_ #include #include @@ -29,12 +29,12 @@ #include "gpiod.hpp" -#include "panther_utils/common_utilities.hpp" +#include "husarion_ugv_utils/common_utilities.hpp" -#include "panther_hardware_interfaces/panther_system/gpio/gpio_driver.hpp" -#include "panther_hardware_interfaces/panther_system/gpio/types.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/gpio/gpio_driver.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/gpio/types.hpp" -namespace panther_hardware_interfaces +namespace husarion_ugv_hardware_interfaces { class EStopResetInterrupted : public std::exception @@ -403,7 +403,7 @@ class GPIOControllerFactory { std::unique_ptr gpio_controller; - if (panther_utils::common_utilities::MeetsVersionRequirement(robot_version, 1.2)) { + if (husarion_ugv_utils::common_utilities::MeetsVersionRequirement(robot_version, 1.2)) { auto config_info_storage = GPIOControllerPTH12X::GetGPIOConfigInfoStorage(); auto gpio_driver = std::make_shared(config_info_storage); @@ -419,6 +419,6 @@ class GPIOControllerFactory }; }; -} // namespace panther_hardware_interfaces +} // namespace husarion_ugv_hardware_interfaces -#endif // PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_GPIO_GPIO_CONTROLLER_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_GPIO_GPIO_CONTROLLER_HPP_ diff --git a/panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/gpio/gpio_driver.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/gpio/gpio_driver.hpp similarity index 95% rename from panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/gpio/gpio_driver.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/gpio/gpio_driver.hpp index e46775fcd..a1a194a4a 100644 --- a/panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/gpio/gpio_driver.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/gpio/gpio_driver.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_GPIO_GPIO_DRIVER_HPP_ -#define PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_GPIO_GPIO_DRIVER_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_GPIO_GPIO_DRIVER_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_GPIO_GPIO_DRIVER_HPP_ #include #include @@ -29,9 +29,9 @@ #include "gpiod.hpp" -#include "panther_hardware_interfaces/panther_system/gpio/types.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/gpio/types.hpp" -namespace panther_hardware_interfaces +namespace husarion_ugv_hardware_interfaces { class GPIODriverInterface @@ -247,6 +247,6 @@ class GPIODriver : public GPIODriverInterface const std::filesystem::path gpio_chip_path_ = "/dev/gpiochip0"; }; -} // namespace panther_hardware_interfaces +} // namespace husarion_ugv_hardware_interfaces -#endif // PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_GPIO_GPIO_DRIVER_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_GPIO_GPIO_DRIVER_HPP_ diff --git a/panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/gpio/types.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/gpio/types.hpp similarity index 87% rename from panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/gpio/types.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/gpio/types.hpp index 9695a8fd2..7aef981fd 100644 --- a/panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/gpio/types.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/gpio/types.hpp @@ -12,15 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_GPIO_TYPES_HPP_ -#define PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_GPIO_TYPES_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_GPIO_TYPES_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_GPIO_TYPES_HPP_ #include #include #include "gpiod.hpp" -namespace panther_hardware_interfaces +namespace husarion_ugv_hardware_interfaces { /** @@ -83,6 +83,6 @@ struct GPIOInfo gpiod::line::offset offset = -1; }; -} // namespace panther_hardware_interfaces +} // namespace husarion_ugv_hardware_interfaces -#endif // PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_GPIO_TYPES_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_GPIO_TYPES_HPP_ diff --git a/panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/lynx_system.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/lynx_system.hpp similarity index 79% rename from panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/lynx_system.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/lynx_system.hpp index b5927e59f..a5d12eb02 100644 --- a/panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/lynx_system.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/lynx_system.hpp @@ -12,15 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_LYNX_SYSTEM_HPP_ -#define PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_LYNX_SYSTEM_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_LYNX_SYSTEM_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_LYNX_SYSTEM_HPP_ #include #include -#include "panther_hardware_interfaces/panther_system/ugv_system.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/ugv_system.hpp" -namespace panther_hardware_interfaces +namespace husarion_ugv_hardware_interfaces { /** @@ -55,6 +55,6 @@ class LynxSystem : public UGVSystem static const inline std::vector kJointOrder = {"fl", "fr", "rl", "rr"}; }; -} // namespace panther_hardware_interfaces +} // namespace husarion_ugv_hardware_interfaces -#endif // PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_LYNX_SYSTEM_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_LYNX_SYSTEM_HPP_ diff --git a/panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/panther_system.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/panther_system.hpp similarity index 79% rename from panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/panther_system.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/panther_system.hpp index 80cf06bb7..ad2a741d7 100644 --- a/panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/panther_system.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/panther_system.hpp @@ -12,15 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_PANTHER_SYSTEM_HPP_ -#define PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_PANTHER_SYSTEM_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_PANTHER_SYSTEM_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_PANTHER_SYSTEM_HPP_ #include #include -#include "panther_hardware_interfaces/panther_system/ugv_system.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/ugv_system.hpp" -namespace panther_hardware_interfaces +namespace husarion_ugv_hardware_interfaces { /** @@ -55,6 +55,6 @@ class PantherSystem : public UGVSystem static const inline std::vector kJointOrder = {"fl", "fr", "rl", "rr"}; }; -} // namespace panther_hardware_interfaces +} // namespace husarion_ugv_hardware_interfaces -#endif // PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_PANTHER_SYSTEM_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_PANTHER_SYSTEM_HPP_ diff --git a/panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp similarity index 91% rename from panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp index 2c00eb69a..7486cc5ae 100644 --- a/panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_CANOPEN_MANAGER_HPP_ -#define PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_CANOPEN_MANAGER_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_CANOPEN_MANAGER_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_CANOPEN_MANAGER_HPP_ #include #include @@ -33,7 +33,7 @@ #include "lely/io2/sys/sigset.hpp" #include "lely/io2/sys/timer.hpp" -namespace panther_hardware_interfaces +namespace husarion_ugv_hardware_interfaces { struct CANopenObject @@ -133,6 +133,6 @@ class CANopenManager const CANopenSettings canopen_settings_; }; -} // namespace panther_hardware_interfaces +} // namespace husarion_ugv_hardware_interfaces -#endif // PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_CANOPEN_MANAGER_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_CANOPEN_MANAGER_HPP_ diff --git a/panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/robot_driver/driver.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/driver.hpp similarity index 91% rename from panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/robot_driver/driver.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/driver.hpp index e4cc87c58..d124368c9 100644 --- a/panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/robot_driver/driver.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/driver.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_DRIVER_HPP_ -#define PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_DRIVER_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_DRIVER_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_DRIVER_HPP_ #include #include @@ -25,7 +25,7 @@ #include "lely/coapp/loop_driver.hpp" -namespace panther_hardware_interfaces +namespace husarion_ugv_hardware_interfaces { struct MotorDriverState @@ -145,6 +145,6 @@ class DriverInterface using SharedPtr = std::shared_ptr; }; -} // namespace panther_hardware_interfaces +} // namespace husarion_ugv_hardware_interfaces -#endif // PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_DRIVER_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_DRIVER_HPP_ diff --git a/panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/robot_driver/lynx_robot_driver.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/lynx_robot_driver.hpp similarity index 75% rename from panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/robot_driver/lynx_robot_driver.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/lynx_robot_driver.hpp index 25b611140..e12a47078 100644 --- a/panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/robot_driver/lynx_robot_driver.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/lynx_robot_driver.hpp @@ -12,18 +12,18 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_LYNX_ROBOT_DRIVER_HPP_ -#define PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_LYNX_ROBOT_DRIVER_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_LYNX_ROBOT_DRIVER_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_LYNX_ROBOT_DRIVER_HPP_ #include #include #include -#include "panther_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp" -#include "panther_hardware_interfaces/panther_system/robot_driver/roboteq_data_converters.hpp" -#include "panther_hardware_interfaces/panther_system/robot_driver/roboteq_robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_data_converters.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_robot_driver.hpp" -namespace panther_hardware_interfaces +namespace husarion_ugv_hardware_interfaces { /** @@ -66,6 +66,6 @@ class LynxRobotDriver : public RoboteqRobotDriver void DefineDrivers() override; }; -} // namespace panther_hardware_interfaces +} // namespace husarion_ugv_hardware_interfaces -#endif // PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_LYNX_ROBOT_DRIVER_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_LYNX_ROBOT_DRIVER_HPP_ diff --git a/panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/robot_driver/panther_robot_driver.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/panther_robot_driver.hpp similarity index 75% rename from panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/robot_driver/panther_robot_driver.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/panther_robot_driver.hpp index 40665e76b..084c0c87f 100644 --- a/panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/robot_driver/panther_robot_driver.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/panther_robot_driver.hpp @@ -12,18 +12,18 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_PANTHER_ROBOT_DRIVER_HPP_ -#define PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_PANTHER_ROBOT_DRIVER_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_PANTHER_ROBOT_DRIVER_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_PANTHER_ROBOT_DRIVER_HPP_ #include #include #include -#include "panther_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp" -#include "panther_hardware_interfaces/panther_system/robot_driver/roboteq_data_converters.hpp" -#include "panther_hardware_interfaces/panther_system/robot_driver/roboteq_robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_data_converters.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_robot_driver.hpp" -namespace panther_hardware_interfaces +namespace husarion_ugv_hardware_interfaces { /** @@ -68,6 +68,6 @@ class PantherRobotDriver : public RoboteqRobotDriver virtual void DefineDrivers(); }; -} // namespace panther_hardware_interfaces +} // namespace husarion_ugv_hardware_interfaces -#endif // PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_PANTHER_ROBOT_DRIVER_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_PANTHER_ROBOT_DRIVER_HPP_ diff --git a/panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/robot_driver/robot_driver.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/robot_driver.hpp similarity index 86% rename from panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/robot_driver/robot_driver.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/robot_driver.hpp index 78e38064b..214b490e2 100644 --- a/panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/robot_driver/robot_driver.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/robot_driver.hpp @@ -12,15 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOT_DRIVER_HPP_ -#define PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOT_DRIVER_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOT_DRIVER_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOT_DRIVER_HPP_ #include #include -#include "panther_hardware_interfaces/panther_system/robot_driver/roboteq_data_converters.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_data_converters.hpp" -namespace panther_hardware_interfaces +namespace husarion_ugv_hardware_interfaces { /** @@ -116,6 +116,6 @@ class RobotDriverInterface virtual bool CommunicationError() = 0; }; -} // namespace panther_hardware_interfaces +} // namespace husarion_ugv_hardware_interfaces -#endif // PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOT_DRIVER_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOT_DRIVER_HPP_ diff --git a/panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/robot_driver/roboteq_data_converters.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_data_converters.hpp similarity index 93% rename from panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/robot_driver/roboteq_data_converters.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_data_converters.hpp index afc071e43..dc7be71fb 100644 --- a/panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/robot_driver/roboteq_data_converters.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_data_converters.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOTEQ_DATA_CONVERTERS_HPP_ -#define PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOTEQ_DATA_CONVERTERS_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOTEQ_DATA_CONVERTERS_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOTEQ_DATA_CONVERTERS_HPP_ #include #include @@ -25,10 +25,10 @@ #include "panther_msgs/msg/runtime_error.hpp" #include "panther_msgs/msg/script_flag.hpp" -#include "panther_hardware_interfaces/panther_system/robot_driver/roboteq_driver.hpp" -#include "panther_hardware_interfaces/utils.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_driver.hpp" +#include "husarion_ugv_hardware_interfaces/utils.hpp" -namespace panther_hardware_interfaces +namespace husarion_ugv_hardware_interfaces { struct DrivetrainSettings @@ -258,6 +258,6 @@ class DriverData bool heartbeat_timeout_ = false; }; -} // namespace panther_hardware_interfaces +} // namespace husarion_ugv_hardware_interfaces -#endif // PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOTEQ_DATA_CONVERTERS_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOTEQ_DATA_CONVERTERS_HPP_ diff --git a/panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/robot_driver/roboteq_driver.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_driver.hpp similarity index 92% rename from panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/robot_driver/roboteq_driver.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_driver.hpp index a499120aa..2abfa8430 100644 --- a/panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/robot_driver/roboteq_driver.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_driver.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOTEQ_DRIVER_HPP_ -#define PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOTEQ_DRIVER_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOTEQ_DRIVER_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOTEQ_DRIVER_HPP_ #include #include @@ -25,9 +25,9 @@ #include "lely/coapp/loop_driver.hpp" -#include "panther_hardware_interfaces/panther_system/robot_driver/driver.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/driver.hpp" -namespace panther_hardware_interfaces +namespace husarion_ugv_hardware_interfaces { // Forward declaration @@ -195,6 +195,6 @@ class RoboteqMotorDriver : public MotorDriverInterface const std::uint8_t channel_; }; -} // namespace panther_hardware_interfaces +} // namespace husarion_ugv_hardware_interfaces -#endif // PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOTEQ_DRIVER_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOTEQ_DRIVER_HPP_ diff --git a/panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/robot_driver/roboteq_error_filter.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_error_filter.hpp similarity index 89% rename from panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/robot_driver/roboteq_error_filter.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_error_filter.hpp index 53a13d10b..50419f7cc 100644 --- a/panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/robot_driver/roboteq_error_filter.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_error_filter.hpp @@ -12,14 +12,14 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOTEQ_ERROR_FILTER_HPP_ -#define PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOTEQ_ERROR_FILTER_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOTEQ_ERROR_FILTER_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOTEQ_ERROR_FILTER_HPP_ #include #include #include -namespace panther_hardware_interfaces +namespace husarion_ugv_hardware_interfaces { class ErrorFilter @@ -102,6 +102,6 @@ class RoboteqErrorFilter std::map error_filters_; }; -} // namespace panther_hardware_interfaces +} // namespace husarion_ugv_hardware_interfaces -#endif // PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOTEQ_ERROR_FILTER_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOTEQ_ERROR_FILTER_HPP_ diff --git a/panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/robot_driver/roboteq_robot_driver.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_robot_driver.hpp similarity index 86% rename from panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/robot_driver/roboteq_robot_driver.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_robot_driver.hpp index 6f8723078..b788729ab 100644 --- a/panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/robot_driver/roboteq_robot_driver.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_robot_driver.hpp @@ -12,19 +12,19 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOTEQ_ROBOT_DRIVER_HPP_ -#define PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOTEQ_ROBOT_DRIVER_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOTEQ_ROBOT_DRIVER_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOTEQ_ROBOT_DRIVER_HPP_ #include #include #include -#include "panther_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp" -#include "panther_hardware_interfaces/panther_system/robot_driver/robot_driver.hpp" -#include "panther_hardware_interfaces/panther_system/robot_driver/roboteq_data_converters.hpp" -#include "panther_hardware_interfaces/panther_system/robot_driver/roboteq_driver.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_data_converters.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_driver.hpp" -namespace panther_hardware_interfaces +namespace husarion_ugv_hardware_interfaces { struct MotorNames @@ -170,6 +170,6 @@ class RoboteqRobotDriver : public RobotDriverInterface const std::chrono::milliseconds activate_wait_time_; }; -} // namespace panther_hardware_interfaces +} // namespace husarion_ugv_hardware_interfaces -#endif // PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOTEQ_ROBOT_DRIVER_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOTEQ_ROBOT_DRIVER_HPP_ diff --git a/panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/system_e_stop.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/system_e_stop.hpp similarity index 86% rename from panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/system_e_stop.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/system_e_stop.hpp index a0d1088eb..5e12536e9 100644 --- a/panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/system_e_stop.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/system_e_stop.hpp @@ -12,18 +12,18 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_SYSTEM_E_STOP_HPP_ -#define PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_SYSTEM_E_STOP_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_SYSTEM_E_STOP_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_SYSTEM_E_STOP_HPP_ #include #include #include -#include "panther_hardware_interfaces/panther_system/gpio/gpio_controller.hpp" -#include "panther_hardware_interfaces/panther_system/robot_driver/robot_driver.hpp" -#include "panther_hardware_interfaces/panther_system/robot_driver/roboteq_error_filter.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/gpio/gpio_controller.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_error_filter.hpp" -namespace panther_hardware_interfaces +namespace husarion_ugv_hardware_interfaces { /** @@ -115,6 +115,6 @@ class EStop : public EStopInterface std::atomic_bool e_stop_triggered_ = true; }; -} // namespace panther_hardware_interfaces +} // namespace husarion_ugv_hardware_interfaces -#endif // PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_SYSTEM_E_STOP_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_SYSTEM_E_STOP_HPP_ diff --git a/panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/system_ros_interface.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/system_ros_interface.hpp similarity index 95% rename from panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/system_ros_interface.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/system_ros_interface.hpp index 856d4b729..c879603a0 100644 --- a/panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/system_ros_interface.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/system_ros_interface.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_SYSTEM_ROS_INTERFACE_HPP_ -#define PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_SYSTEM_ROS_INTERFACE_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_SYSTEM_ROS_INTERFACE_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_SYSTEM_ROS_INTERFACE_HPP_ #include #include @@ -34,12 +34,12 @@ #include "panther_msgs/msg/io_state.hpp" #include "panther_msgs/msg/robot_driver_state.hpp" -#include "panther_hardware_interfaces/panther_system/gpio/gpio_controller.hpp" -#include "panther_hardware_interfaces/panther_system/robot_driver/roboteq_data_converters.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/gpio/gpio_controller.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_data_converters.hpp" using namespace std::placeholders; -namespace panther_hardware_interfaces +namespace husarion_ugv_hardware_interfaces { using BoolMsg = std_msgs::msg::Bool; @@ -308,6 +308,6 @@ class SystemROSInterface std::vector service_wrappers_storage_; }; -} // namespace panther_hardware_interfaces +} // namespace husarion_ugv_hardware_interfaces -#endif // PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_SYSTEM_ROS_INTERFACE_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_SYSTEM_ROS_INTERFACE_HPP_ diff --git a/panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/ugv_system.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/ugv_system.hpp similarity index 88% rename from panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/ugv_system.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/ugv_system.hpp index 03fd02b5c..ebdc0693e 100644 --- a/panther_hardware_interfaces/include/panther_hardware_interfaces/panther_system/ugv_system.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/ugv_system.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_UGV_SYSTEM_HPP_ -#define PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_UGV_SYSTEM_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_UGV_SYSTEM_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_UGV_SYSTEM_HPP_ #include #include @@ -29,14 +29,14 @@ #include #include -#include "panther_hardware_interfaces/panther_system/gpio/gpio_controller.hpp" -#include "panther_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp" -#include "panther_hardware_interfaces/panther_system/robot_driver/robot_driver.hpp" -#include "panther_hardware_interfaces/panther_system/robot_driver/roboteq_error_filter.hpp" -#include "panther_hardware_interfaces/panther_system/system_e_stop.hpp" -#include "panther_hardware_interfaces/panther_system/system_ros_interface.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/gpio/gpio_controller.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_error_filter.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/system_e_stop.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/system_ros_interface.hpp" -namespace panther_hardware_interfaces +namespace husarion_ugv_hardware_interfaces { using return_type = hardware_interface::return_type; @@ -163,6 +163,6 @@ class UGVSystem : public hardware_interface::SystemInterface rclcpp::Duration driver_states_update_period_{0, 0}; }; -} // namespace panther_hardware_interfaces +} // namespace husarion_ugv_hardware_interfaces -#endif // PANTHER_HARDWARE_INTERFACES_PANTHER_SYSTEM_UGV_SYSTEM_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_UGV_SYSTEM_HPP_ diff --git a/panther_hardware_interfaces/include/panther_hardware_interfaces/utils.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/utils.hpp similarity index 89% rename from panther_hardware_interfaces/include/panther_hardware_interfaces/utils.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/utils.hpp index 9a53b7929..b64e85223 100644 --- a/panther_hardware_interfaces/include/panther_hardware_interfaces/utils.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/utils.hpp @@ -12,15 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_HARDWARE_INTERFACES_UTILS_HPP_ -#define PANTHER_HARDWARE_INTERFACES_UTILS_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_UTILS_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_UTILS_HPP_ #include #include #include #include -namespace panther_hardware_interfaces +namespace husarion_ugv_hardware_interfaces { /** @@ -59,6 +59,6 @@ bool OperationWithAttempts( */ bool CheckIfJointNameContainValidSequence(const std::string & name, const std::string & sequence); -} // namespace panther_hardware_interfaces +} // namespace husarion_ugv_hardware_interfaces -#endif // PANTHER_HARDWARE_INTERFACES_UTILS_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_UTILS_HPP_ diff --git a/panther_hardware_interfaces/package.xml b/husarion_ugv_hardware_interfaces/package.xml similarity index 95% rename from panther_hardware_interfaces/package.xml rename to husarion_ugv_hardware_interfaces/package.xml index f3c1dfee8..eca877916 100644 --- a/panther_hardware_interfaces/package.xml +++ b/husarion_ugv_hardware_interfaces/package.xml @@ -1,7 +1,7 @@ - panther_hardware_interfaces + husarion_ugv_hardware_interfaces 2.1.1 Hardware controller for Panther Husarion @@ -31,9 +31,9 @@ generate_parameter_library geometry_msgs hardware_interface + husarion_ugv_utils imu_filter_madgwick panther_msgs - panther_utils phidgets_api rclcpp rclcpp_lifecycle diff --git a/panther_hardware_interfaces/src/panther_imu_sensor/panther_imu_sensor.cpp b/husarion_ugv_hardware_interfaces/src/panther_imu_sensor/panther_imu_sensor.cpp similarity index 98% rename from panther_hardware_interfaces/src/panther_imu_sensor/panther_imu_sensor.cpp rename to husarion_ugv_hardware_interfaces/src/panther_imu_sensor/panther_imu_sensor.cpp index 1cd145178..0fdf3b96a 100644 --- a/panther_hardware_interfaces/src/panther_imu_sensor/panther_imu_sensor.cpp +++ b/husarion_ugv_hardware_interfaces/src/panther_imu_sensor/panther_imu_sensor.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_hardware_interfaces/panther_imu_sensor/panther_imu_sensor.hpp" +#include "husarion_ugv_hardware_interfaces/panther_imu_sensor/panther_imu_sensor.hpp" #include #include @@ -30,7 +30,7 @@ #include "hardware_interface/types/hardware_interface_type_values.hpp" -namespace panther_hardware_interfaces +namespace husarion_ugv_hardware_interfaces { CallbackReturn PantherImuSensor::on_init(const hardware_interface::HardwareInfo & hardware_info) @@ -548,8 +548,8 @@ void PantherImuSensor::SetStateValuesToNans() imu_sensor_state_.begin(), imu_sensor_state_.end(), std::numeric_limits::quiet_NaN()); } -} // namespace panther_hardware_interfaces +} // namespace husarion_ugv_hardware_interfaces #include "pluginlib/class_list_macros.hpp" PLUGINLIB_EXPORT_CLASS( - panther_hardware_interfaces::PantherImuSensor, hardware_interface::SensorInterface) + husarion_ugv_hardware_interfaces::PantherImuSensor, hardware_interface::SensorInterface) diff --git a/panther_hardware_interfaces/src/panther_system/gpio/gpio_controller.cpp b/husarion_ugv_hardware_interfaces/src/panther_system/gpio/gpio_controller.cpp similarity index 96% rename from panther_hardware_interfaces/src/panther_system/gpio/gpio_controller.cpp rename to husarion_ugv_hardware_interfaces/src/panther_system/gpio/gpio_controller.cpp index 7bfbf24c3..f95c14621 100644 --- a/panther_hardware_interfaces/src/panther_system/gpio/gpio_controller.cpp +++ b/husarion_ugv_hardware_interfaces/src/panther_system/gpio/gpio_controller.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_hardware_interfaces/panther_system/gpio/gpio_controller.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/gpio/gpio_controller.hpp" #include #include @@ -24,10 +24,10 @@ #include "gpiod.hpp" -#include "panther_hardware_interfaces/panther_system/gpio/gpio_driver.hpp" -#include "panther_hardware_interfaces/panther_system/gpio/types.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/gpio/gpio_driver.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/gpio/types.hpp" -namespace panther_hardware_interfaces +namespace husarion_ugv_hardware_interfaces { Watchdog::Watchdog(std::shared_ptr gpio_driver) @@ -342,4 +342,4 @@ const std::vector & GPIOControllerPTH10X::GetGPIOConfigInfoStorage() return gpio_config_info_storage_; } -} // namespace panther_hardware_interfaces +} // namespace husarion_ugv_hardware_interfaces diff --git a/panther_hardware_interfaces/src/panther_system/gpio/gpio_driver.cpp b/husarion_ugv_hardware_interfaces/src/panther_system/gpio/gpio_driver.cpp similarity index 95% rename from panther_hardware_interfaces/src/panther_system/gpio/gpio_driver.cpp rename to husarion_ugv_hardware_interfaces/src/panther_system/gpio/gpio_driver.cpp index 09b8c0fdb..59c0d8158 100644 --- a/panther_hardware_interfaces/src/panther_system/gpio/gpio_driver.cpp +++ b/husarion_ugv_hardware_interfaces/src/panther_system/gpio/gpio_driver.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_hardware_interfaces/panther_system/gpio/gpio_driver.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/gpio/gpio_driver.hpp" #include #include @@ -29,9 +29,9 @@ #include "gpiod.hpp" -#include "panther_utils/configure_rt.hpp" +#include "husarion_ugv_utils/configure_rt.hpp" -namespace panther_hardware_interfaces +namespace husarion_ugv_hardware_interfaces { GPIODriver::GPIODriver(std::vector gpio_info_storage) @@ -78,7 +78,7 @@ void GPIODriver::ConfigureEdgeEventCallback(const std::function GPIODriver::CreateLineRequest(gpiod::chip & chip) { auto request_builder = chip.prepare_request(); - request_builder.set_consumer("panther_hardware_interfaces"); + request_builder.set_consumer("husarion_ugv_hardware_interfaces"); for (GPIOInfo & gpio_info : gpio_info_storage_) { ConfigureLineRequest(chip, request_builder, gpio_info); @@ -222,7 +222,7 @@ void GPIODriver::GPIOMonitorOn() void GPIODriver::MonitorAsyncEvents() { if (use_rt_) { - panther_utils::ConfigureRT(gpio_monit_thread_sched_priority_); + husarion_ugv_utils::ConfigureRT(gpio_monit_thread_sched_priority_); } auto edge_event_buffer = gpiod::edge_event_buffer(edge_event_buffer_size_); @@ -308,4 +308,4 @@ GPIOPin GPIODriver::GetPinFromOffset(const gpiod::line::offset & offset) const "Pin with offset " + std::to_string(offset) + " not found in GPIO info storage."); } -} // namespace panther_hardware_interfaces +} // namespace husarion_ugv_hardware_interfaces diff --git a/panther_hardware_interfaces/src/panther_system/lynx_system.cpp b/husarion_ugv_hardware_interfaces/src/panther_system/lynx_system.cpp similarity index 92% rename from panther_hardware_interfaces/src/panther_system/lynx_system.cpp rename to husarion_ugv_hardware_interfaces/src/panther_system/lynx_system.cpp index 8d491af56..9ea4ebbae 100644 --- a/panther_hardware_interfaces/src/panther_system/lynx_system.cpp +++ b/husarion_ugv_hardware_interfaces/src/panther_system/lynx_system.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_hardware_interfaces/panther_system/lynx_system.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/lynx_system.hpp" #include #include @@ -21,11 +21,11 @@ #include "diagnostic_updater/diagnostic_status_wrapper.hpp" #include "rclcpp/logging.hpp" -#include "panther_hardware_interfaces/panther_system/robot_driver/lynx_robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/lynx_robot_driver.hpp" -#include "panther_utils/diagnostics.hpp" +#include "husarion_ugv_utils/diagnostics.hpp" -namespace panther_hardware_interfaces +namespace husarion_ugv_hardware_interfaces { void LynxSystem::ReadCANopenSettingsDriverCANIDs() @@ -133,7 +133,7 @@ void LynxSystem::DiagnoseErrors(diagnostic_updater::DiagnosticStatusWrapper & st level = diagnostic_updater::DiagnosticStatusWrapper::ERROR; message = "Error detected."; - panther_utils::diagnostics::AddKeyValueIfTrue( + husarion_ugv_utils::diagnostics::AddKeyValueIfTrue( status, driver_data.GetErrorMap(), "Driver error: "); } @@ -141,7 +141,7 @@ void LynxSystem::DiagnoseErrors(diagnostic_updater::DiagnosticStatusWrapper & st level = diagnostic_updater::DiagnosticStatusWrapper::ERROR; message = "Error detected."; - panther_utils::diagnostics::AddKeyValueIfTrue( + husarion_ugv_utils::diagnostics::AddKeyValueIfTrue( status, roboteq_error_filter_->GetErrorMap(), "", " error"); } @@ -170,7 +170,8 @@ std::vector LynxSystem::GetSpeedCommands() const static_cast(hw_commands_velocities_[0]), static_cast(hw_commands_velocities_[1])}; } -} // namespace panther_hardware_interfaces +} // namespace husarion_ugv_hardware_interfaces #include "pluginlib/class_list_macros.hpp" -PLUGINLIB_EXPORT_CLASS(panther_hardware_interfaces::LynxSystem, hardware_interface::SystemInterface) +PLUGINLIB_EXPORT_CLASS( + husarion_ugv_hardware_interfaces::LynxSystem, hardware_interface::SystemInterface) diff --git a/panther_hardware_interfaces/src/panther_system/panther_system.cpp b/husarion_ugv_hardware_interfaces/src/panther_system/panther_system.cpp similarity index 93% rename from panther_hardware_interfaces/src/panther_system/panther_system.cpp rename to husarion_ugv_hardware_interfaces/src/panther_system/panther_system.cpp index e87ded9bd..a1ea6a7c6 100644 --- a/panther_hardware_interfaces/src/panther_system/panther_system.cpp +++ b/husarion_ugv_hardware_interfaces/src/panther_system/panther_system.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_hardware_interfaces/panther_system/panther_system.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/panther_system.hpp" #include #include @@ -21,11 +21,11 @@ #include "diagnostic_updater/diagnostic_status_wrapper.hpp" #include "rclcpp/logging.hpp" -#include "panther_hardware_interfaces/panther_system/robot_driver/panther_robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/panther_robot_driver.hpp" -#include "panther_utils/diagnostics.hpp" +#include "husarion_ugv_utils/diagnostics.hpp" -namespace panther_hardware_interfaces +namespace husarion_ugv_hardware_interfaces { void PantherSystem::ReadCANopenSettingsDriverCANIDs() @@ -160,7 +160,7 @@ void PantherSystem::DiagnoseErrors(diagnostic_updater::DiagnosticStatusWrapper & level = diagnostic_updater::DiagnosticStatusWrapper::ERROR; message = "Error detected."; - panther_utils::diagnostics::AddKeyValueIfTrue( + husarion_ugv_utils::diagnostics::AddKeyValueIfTrue( status, front_driver_data.GetErrorMap(), "Front driver error: "); } @@ -169,7 +169,7 @@ void PantherSystem::DiagnoseErrors(diagnostic_updater::DiagnosticStatusWrapper & level = diagnostic_updater::DiagnosticStatusWrapper::ERROR; message = "Error detected."; - panther_utils::diagnostics::AddKeyValueIfTrue( + husarion_ugv_utils::diagnostics::AddKeyValueIfTrue( status, rear_driver_data.GetErrorMap(), "Rear driver error: "); } @@ -177,7 +177,7 @@ void PantherSystem::DiagnoseErrors(diagnostic_updater::DiagnosticStatusWrapper & level = diagnostic_updater::DiagnosticStatusWrapper::ERROR; message = "Error detected."; - panther_utils::diagnostics::AddKeyValueIfTrue( + husarion_ugv_utils::diagnostics::AddKeyValueIfTrue( status, roboteq_error_filter_->GetErrorMap(), "", " error"); } @@ -214,8 +214,8 @@ std::vector PantherSystem::GetSpeedCommands() const static_cast(hw_commands_velocities_[2]), static_cast(hw_commands_velocities_[3])}; } -} // namespace panther_hardware_interfaces +} // namespace husarion_ugv_hardware_interfaces #include "pluginlib/class_list_macros.hpp" PLUGINLIB_EXPORT_CLASS( - panther_hardware_interfaces::PantherSystem, hardware_interface::SystemInterface) + husarion_ugv_hardware_interfaces::PantherSystem, hardware_interface::SystemInterface) diff --git a/panther_hardware_interfaces/src/panther_system/robot_driver/canopen_manager.cpp b/husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/canopen_manager.cpp similarity index 92% rename from panther_hardware_interfaces/src/panther_system/robot_driver/canopen_manager.cpp rename to husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/canopen_manager.cpp index 37dc5db5e..09e54a8b4 100644 --- a/panther_hardware_interfaces/src/panther_system/robot_driver/canopen_manager.cpp +++ b/husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/canopen_manager.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp" #include #include @@ -24,9 +24,9 @@ #include "ament_index_cpp/get_package_share_directory.hpp" -#include "panther_utils/configure_rt.hpp" +#include "husarion_ugv_utils/configure_rt.hpp" -namespace panther_hardware_interfaces +namespace husarion_ugv_hardware_interfaces { CANopenManager::CANopenManager(const CANopenSettings & canopen_settings) @@ -43,7 +43,7 @@ void CANopenManager::Initialize() canopen_communication_started_.store(false); try { - panther_utils::ConfigureRT(kCANopenThreadSchedPriority); + husarion_ugv_utils::ConfigureRT(kCANopenThreadSchedPriority); } catch (const std::runtime_error & e) { std::cerr << "An exception occurred while configuring RT: " << e.what() << std::endl << "Continuing with regular thread settings (it may have a negative impact on the " @@ -137,7 +137,7 @@ void CANopenManager::InitializeCANCommunication() // dcfgen canopen_configuration.yaml -r // dcfgen comes with lely, -r option tells to enable remote PDO mapping std::string master_dcf_path = std::filesystem::path(ament_index_cpp::get_package_share_directory( - "panther_hardware_interfaces")) / + "husarion_ugv_hardware_interfaces")) / "config" / "master.dcf"; master_ = std::make_shared( @@ -156,4 +156,4 @@ void CANopenManager::NotifyCANCommunicationStarted(const bool result) canopen_communication_started_cond_.notify_all(); } -} // namespace panther_hardware_interfaces +} // namespace husarion_ugv_hardware_interfaces diff --git a/panther_hardware_interfaces/src/panther_system/robot_driver/lynx_robot_driver.cpp b/husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/lynx_robot_driver.cpp similarity index 85% rename from panther_hardware_interfaces/src/panther_system/robot_driver/lynx_robot_driver.cpp rename to husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/lynx_robot_driver.cpp index 54b655afe..e15ae280b 100644 --- a/panther_hardware_interfaces/src/panther_system/robot_driver/lynx_robot_driver.cpp +++ b/husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/lynx_robot_driver.cpp @@ -12,17 +12,17 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_hardware_interfaces/panther_system/robot_driver/lynx_robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/lynx_robot_driver.hpp" #include #include #include #include -#include "panther_hardware_interfaces/panther_system/robot_driver/roboteq_driver.hpp" -#include "panther_hardware_interfaces/panther_system/robot_driver/roboteq_robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_driver.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_robot_driver.hpp" -namespace panther_hardware_interfaces +namespace husarion_ugv_hardware_interfaces { void LynxRobotDriver::SendSpeedCommands(const std::vector & speeds) @@ -65,4 +65,4 @@ void LynxRobotDriver::DefineDrivers() drivers_.emplace(DriverNames::DEFAULT, driver); } -} // namespace panther_hardware_interfaces +} // namespace husarion_ugv_hardware_interfaces diff --git a/panther_hardware_interfaces/src/panther_system/robot_driver/panther_robot_driver.cpp b/husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/panther_robot_driver.cpp similarity index 90% rename from panther_hardware_interfaces/src/panther_system/robot_driver/panther_robot_driver.cpp rename to husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/panther_robot_driver.cpp index 7cbbb974b..d9209afcd 100644 --- a/panther_hardware_interfaces/src/panther_system/robot_driver/panther_robot_driver.cpp +++ b/husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/panther_robot_driver.cpp @@ -12,17 +12,17 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_hardware_interfaces/panther_system/robot_driver/panther_robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/panther_robot_driver.hpp" #include #include #include #include -#include "panther_hardware_interfaces/panther_system/robot_driver/roboteq_driver.hpp" -#include "panther_hardware_interfaces/panther_system/robot_driver/roboteq_robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_driver.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_robot_driver.hpp" -namespace panther_hardware_interfaces +namespace husarion_ugv_hardware_interfaces { void PantherRobotDriver::SendSpeedCommands(const std::vector & speeds) @@ -87,4 +87,4 @@ void PantherRobotDriver::DefineDrivers() drivers_.emplace(DriverNames::REAR, rear_driver); } -} // namespace panther_hardware_interfaces +} // namespace husarion_ugv_hardware_interfaces diff --git a/panther_hardware_interfaces/src/panther_system/robot_driver/roboteq_data_converters.cpp b/husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/roboteq_data_converters.cpp similarity index 95% rename from panther_hardware_interfaces/src/panther_system/robot_driver/roboteq_data_converters.cpp rename to husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/roboteq_data_converters.cpp index 0382edb72..1cb9788d8 100644 --- a/panther_hardware_interfaces/src/panther_system/robot_driver/roboteq_data_converters.cpp +++ b/husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/roboteq_data_converters.cpp @@ -12,14 +12,14 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_hardware_interfaces/panther_system/robot_driver/roboteq_data_converters.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_data_converters.hpp" #include -#include "panther_hardware_interfaces/utils.hpp" -#include "panther_utils/common_utilities.hpp" +#include "husarion_ugv_hardware_interfaces/utils.hpp" +#include "husarion_ugv_utils/common_utilities.hpp" -namespace panther_hardware_interfaces +namespace husarion_ugv_hardware_interfaces { RoboteqVelocityCommandConverter::RoboteqVelocityCommandConverter( @@ -264,10 +264,10 @@ std::map DriverData::GetFlagErrorMap() const flag_error_map.merge(fault_flags_.GetErrorMap()); flag_error_map.merge(script_flags_.GetErrorMap()); - auto channel_1_runtime_error_map = panther_utils::common_utilities::PrefixMapKeys( + auto channel_1_runtime_error_map = husarion_ugv_utils::common_utilities::PrefixMapKeys( channel_1_runtime_error_.GetErrorMap(), "channel_1_motor."); - auto channel_2_runtime_error_map = panther_utils::common_utilities::PrefixMapKeys( + auto channel_2_runtime_error_map = husarion_ugv_utils::common_utilities::PrefixMapKeys( channel_2_runtime_error_.GetErrorMap(), "channel_2_motor."); flag_error_map.merge(std::move(channel_1_runtime_error_map)); @@ -291,4 +291,4 @@ std::map DriverData::GetErrorMap() const return error_map; } -} // namespace panther_hardware_interfaces +} // namespace husarion_ugv_hardware_interfaces diff --git a/panther_hardware_interfaces/src/panther_system/robot_driver/roboteq_driver.cpp b/husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/roboteq_driver.cpp similarity index 96% rename from panther_hardware_interfaces/src/panther_system/robot_driver/roboteq_driver.cpp rename to husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/roboteq_driver.cpp index 56bed72d1..427324709 100644 --- a/panther_hardware_interfaces/src/panther_system/robot_driver/roboteq_driver.cpp +++ b/husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/roboteq_driver.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_hardware_interfaces/panther_system/robot_driver/roboteq_driver.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_driver.hpp" #include #include @@ -24,10 +24,10 @@ #include #include -#include "panther_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp" -#include "panther_hardware_interfaces/utils.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp" +#include "husarion_ugv_hardware_interfaces/utils.hpp" -namespace panther_hardware_interfaces +namespace husarion_ugv_hardware_interfaces { // All ids and sub ids were read directly from the eds file. Lely CANopen doesn't have the option @@ -273,4 +273,4 @@ void RoboteqDriver::OnRpdoWrite(const std::uint16_t idx, const std::uint8_t subi } } -} // namespace panther_hardware_interfaces +} // namespace husarion_ugv_hardware_interfaces diff --git a/panther_hardware_interfaces/src/panther_system/robot_driver/roboteq_error_filter.cpp b/husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/roboteq_error_filter.cpp similarity index 93% rename from panther_hardware_interfaces/src/panther_system/robot_driver/roboteq_error_filter.cpp rename to husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/roboteq_error_filter.cpp index 1d15abebc..a45b29590 100644 --- a/panther_hardware_interfaces/src/panther_system/robot_driver/roboteq_error_filter.cpp +++ b/husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/roboteq_error_filter.cpp @@ -12,13 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_hardware_interfaces/panther_system/robot_driver/roboteq_error_filter.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_error_filter.hpp" #include #include #include -namespace panther_hardware_interfaces +namespace husarion_ugv_hardware_interfaces { void ErrorFilter::UpdateError(const bool current_error) @@ -91,4 +91,4 @@ void RoboteqErrorFilter::ClearErrorsIfFlagSet() } } -} // namespace panther_hardware_interfaces +} // namespace husarion_ugv_hardware_interfaces diff --git a/panther_hardware_interfaces/src/panther_system/robot_driver/roboteq_robot_driver.cpp b/husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/roboteq_robot_driver.cpp similarity index 93% rename from panther_hardware_interfaces/src/panther_system/robot_driver/roboteq_robot_driver.cpp rename to husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/roboteq_robot_driver.cpp index 9a3626c09..7bc28775e 100644 --- a/panther_hardware_interfaces/src/panther_system/robot_driver/roboteq_robot_driver.cpp +++ b/husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/roboteq_robot_driver.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_hardware_interfaces/panther_system/robot_driver/robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/robot_driver.hpp" #include #include @@ -24,12 +24,12 @@ #include "lely/util/chrono.hpp" -#include "panther_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp" -#include "panther_hardware_interfaces/panther_system/robot_driver/roboteq_data_converters.hpp" -#include "panther_hardware_interfaces/panther_system/robot_driver/roboteq_driver.hpp" -#include "panther_hardware_interfaces/panther_system/robot_driver/roboteq_robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_data_converters.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_driver.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_robot_driver.hpp" -namespace panther_hardware_interfaces +namespace husarion_ugv_hardware_interfaces { RoboteqRobotDriver::RoboteqRobotDriver( @@ -257,4 +257,4 @@ void RoboteqRobotDriver::BootDrivers() } } -} // namespace panther_hardware_interfaces +} // namespace husarion_ugv_hardware_interfaces diff --git a/panther_hardware_interfaces/src/panther_system/system_e_stop.cpp b/husarion_ugv_hardware_interfaces/src/panther_system/system_e_stop.cpp similarity index 93% rename from panther_hardware_interfaces/src/panther_system/system_e_stop.cpp rename to husarion_ugv_hardware_interfaces/src/panther_system/system_e_stop.cpp index 35efc9873..015dedae9 100644 --- a/panther_hardware_interfaces/src/panther_system/system_e_stop.cpp +++ b/husarion_ugv_hardware_interfaces/src/panther_system/system_e_stop.cpp @@ -17,9 +17,9 @@ #include #include -#include "panther_hardware_interfaces/panther_system/system_e_stop.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/system_e_stop.hpp" -namespace panther_hardware_interfaces +namespace husarion_ugv_hardware_interfaces { bool EStop::ReadEStopState() @@ -83,4 +83,4 @@ void EStop::ResetEStop() } } -} // namespace panther_hardware_interfaces +} // namespace husarion_ugv_hardware_interfaces diff --git a/panther_hardware_interfaces/src/panther_system/system_ros_interface.cpp b/husarion_ugv_hardware_interfaces/src/panther_system/system_ros_interface.cpp similarity index 97% rename from panther_hardware_interfaces/src/panther_system/system_ros_interface.cpp rename to husarion_ugv_hardware_interfaces/src/panther_system/system_ros_interface.cpp index f6b5564eb..4656ebcc7 100644 --- a/panther_hardware_interfaces/src/panther_system/system_ros_interface.cpp +++ b/husarion_ugv_hardware_interfaces/src/panther_system/system_ros_interface.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_hardware_interfaces/panther_system/system_ros_interface.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/system_ros_interface.hpp" #include #include @@ -22,9 +22,9 @@ #include "rclcpp/rclcpp.hpp" #include "realtime_tools/realtime_publisher.h" -#include "panther_hardware_interfaces/panther_system/robot_driver/roboteq_data_converters.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_data_converters.hpp" -namespace panther_hardware_interfaces +namespace husarion_ugv_hardware_interfaces { template class ROSServiceWrapper>; @@ -302,4 +302,4 @@ DriverStateNamedMsg & SystemROSInterface::GetDriverStateByName( return *it; } -} // namespace panther_hardware_interfaces +} // namespace husarion_ugv_hardware_interfaces diff --git a/panther_hardware_interfaces/src/panther_system/ugv_system.cpp b/husarion_ugv_hardware_interfaces/src/panther_system/ugv_system.cpp similarity index 97% rename from panther_hardware_interfaces/src/panther_system/ugv_system.cpp rename to husarion_ugv_hardware_interfaces/src/panther_system/ugv_system.cpp index fcdf497a0..f9843906b 100644 --- a/panther_hardware_interfaces/src/panther_system/ugv_system.cpp +++ b/husarion_ugv_hardware_interfaces/src/panther_system/ugv_system.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_hardware_interfaces/panther_system/ugv_system.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/ugv_system.hpp" #include #include @@ -27,14 +27,14 @@ #include #include -#include "panther_hardware_interfaces/panther_system/robot_driver/panther_robot_driver.hpp" -#include "panther_hardware_interfaces/panther_system/system_ros_interface.hpp" -#include "panther_hardware_interfaces/utils.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/panther_robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/system_ros_interface.hpp" +#include "husarion_ugv_hardware_interfaces/utils.hpp" -#include "panther_utils/common_utilities.hpp" -#include "panther_utils/diagnostics.hpp" +#include "husarion_ugv_utils/common_utilities.hpp" +#include "husarion_ugv_utils/diagnostics.hpp" -namespace panther_hardware_interfaces +namespace husarion_ugv_hardware_interfaces { CallbackReturn UGVSystem::on_init(const hardware_interface::HardwareInfo & hardware_info) @@ -547,4 +547,4 @@ void UGVSystem::MotorsPowerEnable(const bool enable) } } -} // namespace panther_hardware_interfaces +} // namespace husarion_ugv_hardware_interfaces diff --git a/panther_hardware_interfaces/src/utils.cpp b/husarion_ugv_hardware_interfaces/src/utils.cpp similarity index 93% rename from panther_hardware_interfaces/src/utils.cpp rename to husarion_ugv_hardware_interfaces/src/utils.cpp index 1620a06b1..a83d39676 100644 --- a/panther_hardware_interfaces/src/utils.cpp +++ b/husarion_ugv_hardware_interfaces/src/utils.cpp @@ -12,12 +12,12 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_hardware_interfaces/utils.hpp" +#include "husarion_ugv_hardware_interfaces/utils.hpp" #include #include -namespace panther_hardware_interfaces +namespace husarion_ugv_hardware_interfaces { bool OperationWithAttempts( @@ -65,4 +65,4 @@ bool CheckIfJointNameContainValidSequence(const std::string & name, const std::s return true; } -} // namespace panther_hardware_interfaces +} // namespace husarion_ugv_hardware_interfaces diff --git a/panther_hardware_interfaces/test/config/canopen_configuration.yaml b/husarion_ugv_hardware_interfaces/test/config/canopen_configuration.yaml similarity index 100% rename from panther_hardware_interfaces/test/config/canopen_configuration.yaml rename to husarion_ugv_hardware_interfaces/test/config/canopen_configuration.yaml diff --git a/panther_hardware_interfaces/test/config/slave_1.bin b/husarion_ugv_hardware_interfaces/test/config/slave_1.bin similarity index 100% rename from panther_hardware_interfaces/test/config/slave_1.bin rename to husarion_ugv_hardware_interfaces/test/config/slave_1.bin diff --git a/panther_hardware_interfaces/test/panther_imu_sensor/test_panther_imu_sensor.cpp b/husarion_ugv_hardware_interfaces/test/panther_imu_sensor/test_panther_imu_sensor.cpp similarity index 97% rename from panther_hardware_interfaces/test/panther_imu_sensor/test_panther_imu_sensor.cpp rename to husarion_ugv_hardware_interfaces/test/panther_imu_sensor/test_panther_imu_sensor.cpp index 9b99f98a3..bd738568e 100644 --- a/panther_hardware_interfaces/test/panther_imu_sensor/test_panther_imu_sensor.cpp +++ b/husarion_ugv_hardware_interfaces/test/panther_imu_sensor/test_panther_imu_sensor.cpp @@ -26,10 +26,10 @@ #include "lifecycle_msgs/msg/state.hpp" -#include "panther_hardware_interfaces/panther_imu_sensor/panther_imu_sensor.hpp" -#include "panther_utils/test/test_utils.hpp" +#include "husarion_ugv_hardware_interfaces/panther_imu_sensor/panther_imu_sensor.hpp" +#include "husarion_ugv_utils/test/test_utils.hpp" -class PantherImuSensorWrapper : public panther_hardware_interfaces::PantherImuSensor +class PantherImuSensorWrapper : public husarion_ugv_hardware_interfaces::PantherImuSensor { public: PantherImuSensorWrapper() {} @@ -206,7 +206,7 @@ class TestPantherImuSensor : public testing::Test {"world_frame", "enu"}}; inline static const std::string kPluginName = - "panther_hardware_interfaces/PantherImuSensor"; + "husarion_ugv_hardware_interfaces/PantherImuSensor"; std::unique_ptr imu_sensor_; std::shared_ptr rm_; @@ -425,7 +425,7 @@ TEST_F(TestPantherImuSensor, CheckMagnitudeWrongValueAndCalibration) ASSERT_EQ(imu_sensor_->on_init(info), CallbackReturn::SUCCESS); double magnitude[3]; - magnitude[0] = panther_hardware_interfaces::PantherImuSensor::KImuMagneticFieldUnknownValue; + magnitude[0] = husarion_ugv_hardware_interfaces::PantherImuSensor::KImuMagneticFieldUnknownValue; const auto wrong_magnitude_parsed = imu_sensor_->ParseMagnitude(magnitude); ASSERT_FALSE(imu_sensor_->IsVectorFinite(wrong_magnitude_parsed)); @@ -451,7 +451,7 @@ TEST_F(TestPantherImuSensor, CheckCalibrationOnDataCallbackAndAlgorithmInitializ ASSERT_EQ(imu_sensor_->on_init(info), CallbackReturn::SUCCESS); double magnitude[3], acceleration[3], gyration[3]; - magnitude[0] = panther_hardware_interfaces::PantherImuSensor::KImuMagneticFieldUnknownValue; + magnitude[0] = husarion_ugv_hardware_interfaces::PantherImuSensor::KImuMagneticFieldUnknownValue; const auto fake_wrong_magnitude_parsed = imu_sensor_->ParseMagnitude(magnitude); ASSERT_FALSE(imu_sensor_->IsIMUCalibrated(fake_wrong_magnitude_parsed)); @@ -493,7 +493,7 @@ TEST_F(TestPantherImuSensor, CheckReconnection) ASSERT_EQ(imu_sensor_->on_init(info), CallbackReturn::SUCCESS); double magnitude[3], acceleration[3], gyration[3]; - magnitude[0] = panther_hardware_interfaces::PantherImuSensor::KImuMagneticFieldUnknownValue; + magnitude[0] = husarion_ugv_hardware_interfaces::PantherImuSensor::KImuMagneticFieldUnknownValue; // Correct values read from sensor magnitude[0] = -0.09675; diff --git a/panther_hardware_interfaces/test/panther_system/gpio/test_gpio_controller.cpp b/husarion_ugv_hardware_interfaces/test/panther_system/gpio/test_gpio_controller.cpp similarity index 93% rename from panther_hardware_interfaces/test/panther_system/gpio/test_gpio_controller.cpp rename to husarion_ugv_hardware_interfaces/test/panther_system/gpio/test_gpio_controller.cpp index aa50bf309..a05c6fd8e 100644 --- a/panther_hardware_interfaces/test/panther_system/gpio/test_gpio_controller.cpp +++ b/husarion_ugv_hardware_interfaces/test/panther_system/gpio/test_gpio_controller.cpp @@ -20,12 +20,12 @@ #include -#include +#include -using GPIOInfo = panther_hardware_interfaces::GPIOInfo; -using GPIOPin = panther_hardware_interfaces::GPIOPin; +using GPIOInfo = husarion_ugv_hardware_interfaces::GPIOInfo; +using GPIOPin = husarion_ugv_hardware_interfaces::GPIOPin; -class MockGPIODriver : public panther_hardware_interfaces::GPIODriverInterface +class MockGPIODriver : public husarion_ugv_hardware_interfaces::GPIODriverInterface { public: MOCK_METHOD( @@ -42,11 +42,11 @@ class MockGPIODriver : public panther_hardware_interfaces::GPIODriverInterface MOCK_METHOD(bool, SetPinValue, (const GPIOPin pin, const bool value), (override)); }; -class GPIOControllerWrapper : public panther_hardware_interfaces::GPIOControllerPTH12X +class GPIOControllerWrapper : public husarion_ugv_hardware_interfaces::GPIOControllerPTH12X { public: GPIOControllerWrapper(std::shared_ptr gpio_driver) - : panther_hardware_interfaces::GPIOControllerPTH12X(gpio_driver) + : husarion_ugv_hardware_interfaces::GPIOControllerPTH12X(gpio_driver) { } diff --git a/panther_hardware_interfaces/test/panther_system/gpio/test_gpio_driver.cpp b/husarion_ugv_hardware_interfaces/test/panther_system/gpio/test_gpio_driver.cpp similarity index 84% rename from panther_hardware_interfaces/test/panther_system/gpio/test_gpio_driver.cpp rename to husarion_ugv_hardware_interfaces/test/panther_system/gpio/test_gpio_driver.cpp index aede60367..f8086776f 100644 --- a/panther_hardware_interfaces/test/panther_system/gpio/test_gpio_driver.cpp +++ b/husarion_ugv_hardware_interfaces/test/panther_system/gpio/test_gpio_driver.cpp @@ -24,11 +24,11 @@ #include #include -#include "panther_hardware_interfaces/panther_system/gpio/gpio_driver.hpp" -#include "panther_utils/test/test_utils.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/gpio/gpio_driver.hpp" +#include "husarion_ugv_utils/test/test_utils.hpp" -using GPIOInfo = panther_hardware_interfaces::GPIOInfo; -using GPIOPin = panther_hardware_interfaces::GPIOPin; +using GPIOInfo = husarion_ugv_hardware_interfaces::GPIOInfo; +using GPIOPin = husarion_ugv_hardware_interfaces::GPIOPin; class TestGPIODriver : public ::testing::Test { @@ -43,7 +43,7 @@ class TestGPIODriver : public ::testing::Test void TearDown() override; void SetAndVerifyPinState(const GPIOPin & pin); - std::unique_ptr gpio_driver_; + std::unique_ptr gpio_driver_; std::pair last_gpio_event_summary_; const std::vector gpio_config_info_{ GPIOInfo{GPIOPin::LED_SBC_SEL, gpiod::line::direction::OUTPUT}, @@ -52,7 +52,7 @@ class TestGPIODriver : public ::testing::Test void TestGPIODriver::SetUp() { - gpio_driver_ = std::make_unique(gpio_config_info_); + gpio_driver_ = std::make_unique(gpio_config_info_); last_gpio_event_summary_.first = static_cast(-1); last_gpio_event_summary_.second = static_cast(-1); @@ -80,7 +80,7 @@ TEST(TestGPIODriverInitialization, EmptyInfoStorage) EXPECT_THROW( { auto gpio_driver = - std::make_unique(std::vector{}); + std::make_unique(std::vector{}); }, std::runtime_error); } @@ -90,11 +90,11 @@ TEST(TestGPIODriverInitialization, WrongPinConfigFail) // There is no OS version that supports simultaneous operation of MOTOR_ON and VMOT_ON pins. EXPECT_THROW( { - auto gpio_driver = std::make_unique( + auto gpio_driver = std::make_unique( std::vector{{GPIOPin::MOTOR_ON, gpiod::line::direction::OUTPUT}}); gpio_driver.reset(); - gpio_driver = std::make_unique( + gpio_driver = std::make_unique( std::vector{{GPIOPin::VMOT_ON, gpiod::line::direction::OUTPUT}}); }, std::invalid_argument); @@ -102,7 +102,7 @@ TEST(TestGPIODriverInitialization, WrongPinConfigFail) TEST_F(TestGPIODriver, SetWrongPinValue) { - auto is_message_thrown = panther_utils::test_utils::IsMessageThrown( + auto is_message_thrown = husarion_ugv_utils::test_utils::IsMessageThrown( [&]() { this->gpio_driver_->SetPinValue(static_cast(-1), true); }, "Pin not found in GPIO info storage."); @@ -132,7 +132,7 @@ TEST_F(TestGPIODriver, IsPinActive) TEST_F(TestGPIODriver, IsPinActiveNoMonitorThread) { - auto is_message_thrown = panther_utils::test_utils::IsMessageThrown( + auto is_message_thrown = husarion_ugv_utils::test_utils::IsMessageThrown( [&]() { this->gpio_driver_->IsPinActive(GPIOPin::LED_SBC_SEL); }, "GPIO monitor thread is not running!"); @@ -166,7 +166,7 @@ TEST_F(TestGPIODriver, GPIOMonitorEnableUseRT) TEST_F(TestGPIODriver, GPIOEventCallbackNoMonitorThread) { - auto is_message_thrown = panther_utils::test_utils::IsMessageThrown( + auto is_message_thrown = husarion_ugv_utils::test_utils::IsMessageThrown( [&]() { this->gpio_driver_->ConfigureEdgeEventCallback( std::bind(&TestGPIODriver::GPIOEventCallback, this, std::placeholders::_1)); @@ -202,7 +202,7 @@ TEST_F(TestGPIODriver, ChangePinDirection) this->gpio_driver_->GPIOMonitorEnable(); this->gpio_driver_->ChangePinDirection(GPIOPin::LED_SBC_SEL, gpiod::line::direction::INPUT); - auto is_message_thrown = panther_utils::test_utils::IsMessageThrown( + auto is_message_thrown = husarion_ugv_utils::test_utils::IsMessageThrown( [&]() { this->gpio_driver_->SetPinValue(GPIOPin::LED_SBC_SEL, true); }, "Cannot set value for INPUT pin."); diff --git a/panther_hardware_interfaces/test/test_utils.cpp b/husarion_ugv_hardware_interfaces/test/test_utils.cpp similarity index 86% rename from panther_hardware_interfaces/test/test_utils.cpp rename to husarion_ugv_hardware_interfaces/test/test_utils.cpp index 43f8c4574..8d6f0f889 100644 --- a/panther_hardware_interfaces/test/test_utils.cpp +++ b/husarion_ugv_hardware_interfaces/test/test_utils.cpp @@ -19,11 +19,11 @@ #include -#include +#include TEST(TestUtils, GetByte) { - using panther_hardware_interfaces::GetByte; + using husarion_ugv_hardware_interfaces::GetByte; EXPECT_EQ(GetByte(static_cast(0xFA3B4186), 0), 0x86); EXPECT_EQ(GetByte(static_cast(0xFA3B4186), 1), 0x41); @@ -33,7 +33,7 @@ TEST(TestUtils, GetByte) TEST(TestUtils, GetByteOutOfRange) { - using panther_hardware_interfaces::GetByte; + using husarion_ugv_hardware_interfaces::GetByte; EXPECT_THROW(GetByte(static_cast(0xFA3B4186), 4), std::runtime_error); EXPECT_THROW(GetByte(static_cast(0xFA3B4186), -1), std::runtime_error); @@ -45,7 +45,7 @@ TEST(TestUtils, OperationWithAttemptsFailTest) unsigned attempts_counter = 0; unsigned on_error_counter = 0; - EXPECT_FALSE(panther_hardware_interfaces::OperationWithAttempts( + EXPECT_FALSE(husarion_ugv_hardware_interfaces::OperationWithAttempts( [&attempts_counter]() { ++attempts_counter; throw std::runtime_error(""); @@ -60,7 +60,7 @@ TEST(TestUtils, OperationWithAttemptsSuccessTest) unsigned max_attempts = 5; unsigned attempts_counter = 0; - EXPECT_TRUE(panther_hardware_interfaces::OperationWithAttempts( + EXPECT_TRUE(husarion_ugv_hardware_interfaces::OperationWithAttempts( [&attempts_counter, &max_attempts]() { ++attempts_counter; if (attempts_counter < max_attempts) { @@ -73,13 +73,13 @@ TEST(TestUtils, OperationWithAttemptsSuccessTest) TEST(TestUtils, OperationWithAttemptsOnErrorThrowTest) { - EXPECT_FALSE(panther_hardware_interfaces::OperationWithAttempts( + EXPECT_FALSE(husarion_ugv_hardware_interfaces::OperationWithAttempts( []() { throw std::runtime_error(""); }, 5, []() { throw std::runtime_error(""); })); } TEST(TestUtils, CheckIfJointNameContainValidSequence) { - using panther_hardware_interfaces::CheckIfJointNameContainValidSequence; + using husarion_ugv_hardware_interfaces::CheckIfJointNameContainValidSequence; EXPECT_TRUE(CheckIfJointNameContainValidSequence("fr_wheel_joint", "fr")); EXPECT_TRUE(CheckIfJointNameContainValidSequence("namespace/fr_wheel_joint", "fr")); diff --git a/panther_hardware_interfaces/test/unit/panther_system/robot_driver/test_canopen_manager.cpp b/husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_canopen_manager.cpp similarity index 74% rename from panther_hardware_interfaces/test/unit/panther_system/robot_driver/test_canopen_manager.cpp rename to husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_canopen_manager.cpp index 51d5ec2bb..d0c54a98c 100644 --- a/panther_hardware_interfaces/test/unit/panther_system/robot_driver/test_canopen_manager.cpp +++ b/husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_canopen_manager.cpp @@ -19,12 +19,12 @@ #include #include -#include "panther_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp" #include "utils/fake_can_socket.hpp" #include "utils/test_constants.hpp" -#include "panther_utils/test/test_utils.hpp" +#include "husarion_ugv_utils/test/test_utils.hpp" class TestCANopenManager : public ::testing::Test { @@ -34,17 +34,17 @@ class TestCANopenManager : public ::testing::Test ~TestCANopenManager() {} protected: - std::unique_ptr can_socket_; - std::unique_ptr canopen_manager_; + std::unique_ptr can_socket_; + std::unique_ptr canopen_manager_; }; TestCANopenManager::TestCANopenManager() { - can_socket_ = std::make_unique( - panther_hardware_interfaces_test::kCANopenSettings.can_interface_name); + can_socket_ = std::make_unique( + husarion_ugv_hardware_interfaces_test::kCANopenSettings.can_interface_name); - canopen_manager_ = std::make_unique( - panther_hardware_interfaces_test::kCANopenSettings); + canopen_manager_ = std::make_unique( + husarion_ugv_hardware_interfaces_test::kCANopenSettings); } TEST_F(TestCANopenManager, InitializeAndDeinitialize) @@ -71,7 +71,7 @@ TEST_F(TestCANopenManager, Activate) TEST_F(TestCANopenManager, ActivateNotInitialized) { - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( [&]() { canopen_manager_->Activate(); }, "CANopenManager not initialized.")); } @@ -90,7 +90,7 @@ TEST_F(TestCANopenManager, GetMaster) TEST_F(TestCANopenManager, GetMasterNotInitialized) { - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( [&]() { canopen_manager_->GetMaster(); }, "CANopenManager not initialized.")); } diff --git a/panther_hardware_interfaces/test/unit/panther_system/robot_driver/test_lynx_robot_driver.cpp b/husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_lynx_robot_driver.cpp similarity index 58% rename from panther_hardware_interfaces/test/unit/panther_system/robot_driver/test_lynx_robot_driver.cpp rename to husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_lynx_robot_driver.cpp index da5706cdb..ba56643bf 100644 --- a/panther_hardware_interfaces/test/unit/panther_system/robot_driver/test_lynx_robot_driver.cpp +++ b/husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_lynx_robot_driver.cpp @@ -20,48 +20,49 @@ #include -#include -#include -#include -#include +#include +#include +#include +#include #include "utils/fake_can_socket.hpp" #include "utils/mock_driver.hpp" #include "utils/test_constants.hpp" -#include "panther_utils/test/test_utils.hpp" +#include "husarion_ugv_utils/test/test_utils.hpp" -class LynxRobotDriverWrapper : public panther_hardware_interfaces::LynxRobotDriver +class LynxRobotDriverWrapper : public husarion_ugv_hardware_interfaces::LynxRobotDriver { public: LynxRobotDriverWrapper( - const panther_hardware_interfaces::CANopenSettings & canopen_settings, - const panther_hardware_interfaces::DrivetrainSettings & drivetrain_settings, + const husarion_ugv_hardware_interfaces::CANopenSettings & canopen_settings, + const husarion_ugv_hardware_interfaces::DrivetrainSettings & drivetrain_settings, const std::chrono::milliseconds activate_wait_time = std::chrono::milliseconds(1000)) : LynxRobotDriver(canopen_settings, drivetrain_settings, activate_wait_time) { - mock_left_motor_driver = - std::make_shared<::testing::NiceMock>(); - mock_right_motor_driver = - std::make_shared<::testing::NiceMock>(); + mock_left_motor_driver = std::make_shared< + ::testing::NiceMock>(); + mock_right_motor_driver = std::make_shared< + ::testing::NiceMock>(); mock_driver = - std::make_shared<::testing::NiceMock>(); + std::make_shared<::testing::NiceMock>(); mock_driver->AddMotorDriver( - panther_hardware_interfaces::MotorNames::LEFT, mock_left_motor_driver); + husarion_ugv_hardware_interfaces::MotorNames::LEFT, mock_left_motor_driver); mock_driver->AddMotorDriver( - panther_hardware_interfaces::MotorNames::RIGHT, mock_right_motor_driver); + husarion_ugv_hardware_interfaces::MotorNames::RIGHT, mock_right_motor_driver); } void DefineDrivers() override { - drivers_.emplace(panther_hardware_interfaces::DriverNames::DEFAULT, mock_driver); + drivers_.emplace(husarion_ugv_hardware_interfaces::DriverNames::DEFAULT, mock_driver); } - std::shared_ptr<::testing::NiceMock> mock_driver; - std::shared_ptr<::testing::NiceMock> + std::shared_ptr<::testing::NiceMock> + mock_driver; + std::shared_ptr<::testing::NiceMock> mock_left_motor_driver; - std::shared_ptr<::testing::NiceMock> + std::shared_ptr<::testing::NiceMock> mock_right_motor_driver; }; @@ -70,13 +71,13 @@ class TestLynxRobotDriver : public ::testing::Test public: TestLynxRobotDriver() { - can_socket_ = std::make_unique( - panther_hardware_interfaces_test::kCANopenSettings.can_interface_name); + can_socket_ = std::make_unique( + husarion_ugv_hardware_interfaces_test::kCANopenSettings.can_interface_name); can_socket_->Initialize(); robot_driver_ = std::make_unique( - panther_hardware_interfaces_test::kCANopenSettings, - panther_hardware_interfaces_test::kDrivetrainSettings, std::chrono::milliseconds(10)); + husarion_ugv_hardware_interfaces_test::kCANopenSettings, + husarion_ugv_hardware_interfaces_test::kDrivetrainSettings, std::chrono::milliseconds(10)); robot_driver_->Initialize(); robot_driver_->Activate(); @@ -85,13 +86,13 @@ class TestLynxRobotDriver : public ::testing::Test ~TestLynxRobotDriver() { robot_driver_->Deinitialize(); } protected: - std::unique_ptr can_socket_; + std::unique_ptr can_socket_; std::unique_ptr robot_driver_; }; TEST_F(TestLynxRobotDriver, SendSpeedCommands) { - using panther_hardware_interfaces_test::kRadPerSecToRbtqCmd; + using husarion_ugv_hardware_interfaces_test::kRadPerSecToRbtqCmd; const float left_v = 0.1; const float right_v = 0.2; @@ -115,7 +116,7 @@ TEST_F(TestLynxRobotDriver, SendSpeedCommandsSendCmdVelError) EXPECT_CALL(*robot_driver_->mock_left_motor_driver, SendCmdVel(::testing::_)) .WillOnce(::testing::Throw(std::runtime_error(""))); - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( [&]() { robot_driver_->SendSpeedCommands({0.0, 0.0}); }, "Driver send Roboteq cmd failed:")); } @@ -123,7 +124,7 @@ TEST_F(TestLynxRobotDriver, SendSpeedCommandsCANError) { EXPECT_CALL(*robot_driver_->mock_driver, IsCANError()).WillOnce(::testing::Return(true)); - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( [&]() { robot_driver_->SendSpeedCommands({0.0, 0.0}); }, "CAN error detected on the Driver when trying to write speed commands.")); } @@ -132,7 +133,7 @@ TEST_F(TestLynxRobotDriver, SendSpeedCommandsInvalidVectorSize) { const std::vector speeds = {0.1, 0.2, 0.3}; - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( [&]() { robot_driver_->SendSpeedCommands(speeds); }, "Invalid speeds vector size")); } diff --git a/panther_hardware_interfaces/test/unit/panther_system/robot_driver/test_panther_robot_driver.cpp b/husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_panther_robot_driver.cpp similarity index 55% rename from panther_hardware_interfaces/test/unit/panther_system/robot_driver/test_panther_robot_driver.cpp rename to husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_panther_robot_driver.cpp index 7ba08f5f6..f714560e7 100644 --- a/panther_hardware_interfaces/test/unit/panther_system/robot_driver/test_panther_robot_driver.cpp +++ b/husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_panther_robot_driver.cpp @@ -20,67 +20,67 @@ #include -#include -#include -#include -#include +#include +#include +#include +#include #include "utils/fake_can_socket.hpp" #include "utils/mock_driver.hpp" #include "utils/test_constants.hpp" -#include "panther_utils/test/test_utils.hpp" +#include "husarion_ugv_utils/test/test_utils.hpp" -class PantherRobotDriverWrapper : public panther_hardware_interfaces::PantherRobotDriver +class PantherRobotDriverWrapper : public husarion_ugv_hardware_interfaces::PantherRobotDriver { public: PantherRobotDriverWrapper( - const panther_hardware_interfaces::CANopenSettings & canopen_settings, - const panther_hardware_interfaces::DrivetrainSettings & drivetrain_settings, + const husarion_ugv_hardware_interfaces::CANopenSettings & canopen_settings, + const husarion_ugv_hardware_interfaces::DrivetrainSettings & drivetrain_settings, const std::chrono::milliseconds activate_wait_time = std::chrono::milliseconds(1000)) : PantherRobotDriver(canopen_settings, drivetrain_settings, activate_wait_time) { - mock_fl_motor_driver = - std::make_shared<::testing::NiceMock>(); - mock_fr_motor_driver = - std::make_shared<::testing::NiceMock>(); - mock_rl_motor_driver = - std::make_shared<::testing::NiceMock>(); - mock_rr_motor_driver = - std::make_shared<::testing::NiceMock>(); + mock_fl_motor_driver = std::make_shared< + ::testing::NiceMock>(); + mock_fr_motor_driver = std::make_shared< + ::testing::NiceMock>(); + mock_rl_motor_driver = std::make_shared< + ::testing::NiceMock>(); + mock_rr_motor_driver = std::make_shared< + ::testing::NiceMock>(); mock_front_driver = - std::make_shared<::testing::NiceMock>(); + std::make_shared<::testing::NiceMock>(); mock_front_driver->AddMotorDriver( - panther_hardware_interfaces::MotorNames::LEFT, mock_fl_motor_driver); + husarion_ugv_hardware_interfaces::MotorNames::LEFT, mock_fl_motor_driver); mock_front_driver->AddMotorDriver( - panther_hardware_interfaces::MotorNames::RIGHT, mock_fr_motor_driver); + husarion_ugv_hardware_interfaces::MotorNames::RIGHT, mock_fr_motor_driver); mock_rear_driver = - std::make_shared<::testing::NiceMock>(); + std::make_shared<::testing::NiceMock>(); mock_rear_driver->AddMotorDriver( - panther_hardware_interfaces::MotorNames::LEFT, mock_rl_motor_driver); + husarion_ugv_hardware_interfaces::MotorNames::LEFT, mock_rl_motor_driver); mock_rear_driver->AddMotorDriver( - panther_hardware_interfaces::MotorNames::RIGHT, mock_rr_motor_driver); + husarion_ugv_hardware_interfaces::MotorNames::RIGHT, mock_rr_motor_driver); } void DefineDrivers() override { - drivers_.emplace(panther_hardware_interfaces::DriverNames::FRONT, mock_front_driver); - drivers_.emplace(panther_hardware_interfaces::DriverNames::REAR, mock_rear_driver); + drivers_.emplace(husarion_ugv_hardware_interfaces::DriverNames::FRONT, mock_front_driver); + drivers_.emplace(husarion_ugv_hardware_interfaces::DriverNames::REAR, mock_rear_driver); } - std::shared_ptr<::testing::NiceMock> + std::shared_ptr<::testing::NiceMock> mock_front_driver; - std::shared_ptr<::testing::NiceMock> + std::shared_ptr<::testing::NiceMock> mock_rear_driver; - std::shared_ptr<::testing::NiceMock> + std::shared_ptr<::testing::NiceMock> mock_fl_motor_driver; - std::shared_ptr<::testing::NiceMock> + std::shared_ptr<::testing::NiceMock> mock_fr_motor_driver; - std::shared_ptr<::testing::NiceMock> + std::shared_ptr<::testing::NiceMock> mock_rl_motor_driver; - std::shared_ptr<::testing::NiceMock> + std::shared_ptr<::testing::NiceMock> mock_rr_motor_driver; }; @@ -89,13 +89,13 @@ class TestPantherRobotDriver : public ::testing::Test public: TestPantherRobotDriver() { - can_socket_ = std::make_unique( - panther_hardware_interfaces_test::kCANopenSettings.can_interface_name); + can_socket_ = std::make_unique( + husarion_ugv_hardware_interfaces_test::kCANopenSettings.can_interface_name); can_socket_->Initialize(); robot_driver_ = std::make_unique( - panther_hardware_interfaces_test::kCANopenSettings, - panther_hardware_interfaces_test::kDrivetrainSettings, std::chrono::milliseconds(10)); + husarion_ugv_hardware_interfaces_test::kCANopenSettings, + husarion_ugv_hardware_interfaces_test::kDrivetrainSettings, std::chrono::milliseconds(10)); robot_driver_->Initialize(); robot_driver_->Activate(); @@ -104,13 +104,13 @@ class TestPantherRobotDriver : public ::testing::Test ~TestPantherRobotDriver() { robot_driver_->Deinitialize(); } protected: - std::unique_ptr can_socket_; + std::unique_ptr can_socket_; std::unique_ptr robot_driver_; }; TEST_F(TestPantherRobotDriver, SendSpeedCommands) { - using panther_hardware_interfaces_test::kRadPerSecToRbtqCmd; + using husarion_ugv_hardware_interfaces_test::kRadPerSecToRbtqCmd; const float fl_v = 0.1; const float fr_v = 0.2; @@ -145,7 +145,7 @@ TEST_F(TestPantherRobotDriver, SendSpeedCommandsSendCmdVelError) EXPECT_CALL(*robot_driver_->mock_fl_motor_driver, SendCmdVel(::testing::_)) .WillOnce(::testing::Throw(std::runtime_error(""))); - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( [&]() { robot_driver_->SendSpeedCommands({0.0, 0.0, 0.0, 0.0}); }, "Front driver send Roboteq cmd failed:")); } @@ -154,7 +154,7 @@ TEST_F(TestPantherRobotDriver, SendSpeedCommandsCANError) { EXPECT_CALL(*robot_driver_->mock_front_driver, IsCANError()).WillOnce(::testing::Return(true)); - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( [&]() { robot_driver_->SendSpeedCommands({0.0, 0.0, 0.0, 0.0}); }, "CAN error detected on the front driver when trying to write speed commands.")); } @@ -163,7 +163,7 @@ TEST_F(TestPantherRobotDriver, SendSpeedCommandsInvalidVectorSize) { const std::vector speeds = {0.1, 0.2, 0.3}; - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( [&]() { robot_driver_->SendSpeedCommands(speeds); }, "Invalid speeds vector size")); } diff --git a/panther_hardware_interfaces/test/unit/panther_system/robot_driver/test_roboteq_data_converters.cpp b/husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_roboteq_data_converters.cpp similarity index 86% rename from panther_hardware_interfaces/test/unit/panther_system/robot_driver/test_roboteq_data_converters.cpp rename to husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_roboteq_data_converters.cpp index 1bba27234..49c651223 100644 --- a/panther_hardware_interfaces/test/unit/panther_system/robot_driver/test_roboteq_data_converters.cpp +++ b/husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_roboteq_data_converters.cpp @@ -19,7 +19,7 @@ #include -#include "panther_hardware_interfaces/panther_system/robot_driver/roboteq_data_converters.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_data_converters.hpp" #include "utils/test_constants.hpp" @@ -70,8 +70,8 @@ void TestRuntimeErrorMsg( TEST(TestRoboteqDataConverters, CommandConverter) { - panther_hardware_interfaces::RoboteqVelocityCommandConverter cmd_converter( - panther_hardware_interfaces_test::kDrivetrainSettings); + husarion_ugv_hardware_interfaces::RoboteqVelocityCommandConverter cmd_converter( + husarion_ugv_hardware_interfaces_test::kDrivetrainSettings); const float conversion_factor = 79.789678; @@ -84,18 +84,18 @@ TEST(TestRoboteqDataConverters, CommandConverter) TEST(TestRoboteqDataConverters, MotorState) { - using panther_hardware_interfaces_test::kRbtqCurrentFbToNewtonMeters; - using panther_hardware_interfaces_test::kRbtqPosFbToRad; - using panther_hardware_interfaces_test::kRbtqVelFbToRadPerSec; + using husarion_ugv_hardware_interfaces_test::kRbtqCurrentFbToNewtonMeters; + using husarion_ugv_hardware_interfaces_test::kRbtqPosFbToRad; + using husarion_ugv_hardware_interfaces_test::kRbtqVelFbToRadPerSec; - panther_hardware_interfaces::MotorState motor_state( - panther_hardware_interfaces_test::kDrivetrainSettings); + husarion_ugv_hardware_interfaces::MotorState motor_state( + husarion_ugv_hardware_interfaces_test::kDrivetrainSettings); EXPECT_FLOAT_EQ(motor_state.GetPosition(), 0.0); EXPECT_FLOAT_EQ(motor_state.GetVelocity(), 0.0); EXPECT_FLOAT_EQ(motor_state.GetTorque(), 0.0); - panther_hardware_interfaces::MotorDriverState feedback1; + husarion_ugv_hardware_interfaces::MotorDriverState feedback1; feedback1.pos = 48128; feedback1.vel = 1000; feedback1.current = 1; @@ -105,7 +105,7 @@ TEST(TestRoboteqDataConverters, MotorState) EXPECT_FLOAT_EQ(motor_state.GetVelocity(), feedback1.vel * kRbtqVelFbToRadPerSec); EXPECT_FLOAT_EQ(motor_state.GetTorque(), feedback1.current * kRbtqCurrentFbToNewtonMeters); - panther_hardware_interfaces::MotorDriverState feedback2; + husarion_ugv_hardware_interfaces::MotorDriverState feedback2; feedback2.pos = -48128; feedback2.vel = -1000; feedback2.current = -1; @@ -118,7 +118,7 @@ TEST(TestRoboteqDataConverters, MotorState) TEST(TestRoboteqDataConverters, FlagError) { - panther_hardware_interfaces::FlagError flag_error( + husarion_ugv_hardware_interfaces::FlagError flag_error( {"error1", "error2", "error3", "error4", "error5", "error6", "error7", "error8"}, {"error2", "error6"}); @@ -140,7 +140,7 @@ TEST(TestRoboteqDataConverters, FlagError) TEST(TestRoboteqDataConverters, FaultFlag) { - panther_hardware_interfaces::FaultFlag fault_flag; + husarion_ugv_hardware_interfaces::FaultFlag fault_flag; fault_flag.SetData(0b00000001); TestFaultFlagMsg( @@ -173,7 +173,7 @@ TEST(TestRoboteqDataConverters, FaultFlag) TEST(TestRoboteqDataConverters, ScriptFlag) { - panther_hardware_interfaces::ScriptFlag script_flag; + husarion_ugv_hardware_interfaces::ScriptFlag script_flag; script_flag.SetData(0b00000001); TestScriptFlagMsg(script_flag.GetMessage(), {true, false, false}); @@ -188,7 +188,7 @@ TEST(TestRoboteqDataConverters, ScriptFlag) TEST(TestRoboteqDataConverters, RuntimeError) { - panther_hardware_interfaces::RuntimeError runtime_error; + husarion_ugv_hardware_interfaces::RuntimeError runtime_error; runtime_error.SetData(0b00000001); TestRuntimeErrorMsg(runtime_error.GetMessage(), {true, false, false, false, false, false, false}); @@ -215,7 +215,7 @@ TEST(TestRoboteqDataConverters, RuntimeError) TEST(TestRoboteqDataConverters, DriverState) { - panther_hardware_interfaces::RoboteqDriverState driver_state; + husarion_ugv_hardware_interfaces::RoboteqDriverState driver_state; EXPECT_FLOAT_EQ(driver_state.GetTemperature(), 0.0); EXPECT_FLOAT_EQ(driver_state.GetVoltage(), 0.0); @@ -233,18 +233,19 @@ TEST(TestRoboteqDataConverters, DriverState) TEST(TestRoboteqDataConverters, DriverData) { - using panther_hardware_interfaces::RoboteqDriver; - using panther_hardware_interfaces_test::kRbtqCurrentFbToNewtonMeters; - using panther_hardware_interfaces_test::kRbtqPosFbToRad; - using panther_hardware_interfaces_test::kRbtqVelFbToRadPerSec; + using husarion_ugv_hardware_interfaces::RoboteqDriver; + using husarion_ugv_hardware_interfaces_test::kRbtqCurrentFbToNewtonMeters; + using husarion_ugv_hardware_interfaces_test::kRbtqPosFbToRad; + using husarion_ugv_hardware_interfaces_test::kRbtqVelFbToRadPerSec; - panther_hardware_interfaces::DriverData roboteq_data( - panther_hardware_interfaces_test::kDrivetrainSettings); + husarion_ugv_hardware_interfaces::DriverData roboteq_data( + husarion_ugv_hardware_interfaces_test::kDrivetrainSettings); ASSERT_FALSE(roboteq_data.IsError()); - const panther_hardware_interfaces::MotorDriverState channel_1_state = {0, 0, 0, {0, 0}, {0, 0}}; - const panther_hardware_interfaces::MotorDriverState channel_2_state = { + const husarion_ugv_hardware_interfaces::MotorDriverState channel_1_state = { + 0, 0, 0, {0, 0}, {0, 0}}; + const husarion_ugv_hardware_interfaces::MotorDriverState channel_2_state = { 48128, 1000, 1, {0, 0}, {0, 0}}; roboteq_data.SetMotorsStates(channel_1_state, channel_2_state, true); @@ -277,7 +278,7 @@ TEST(TestRoboteqDataConverters, DriverData) roboteq_data.GetMotorState(RoboteqDriver::kChannel2).GetTorque(), channel_2_state.current * kRbtqCurrentFbToNewtonMeters); - panther_hardware_interfaces::DriverState state; + husarion_ugv_hardware_interfaces::DriverState state; state.fault_flags = 0b00000001; state.script_flags = 0b00000010; diff --git a/panther_hardware_interfaces/test/unit/panther_system/robot_driver/test_roboteq_driver.cpp b/husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_roboteq_driver.cpp similarity index 80% rename from panther_hardware_interfaces/test/unit/panther_system/robot_driver/test_roboteq_driver.cpp rename to husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_roboteq_driver.cpp index 288bc3d07..0d3a50516 100644 --- a/panther_hardware_interfaces/test/unit/panther_system/robot_driver/test_roboteq_driver.cpp +++ b/husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_roboteq_driver.cpp @@ -20,14 +20,14 @@ #include -#include "panther_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp" -#include "panther_hardware_interfaces/panther_system/robot_driver/roboteq_driver.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_driver.hpp" #include "utils/fake_can_socket.hpp" #include "utils/mock_roboteq.hpp" #include "utils/test_constants.hpp" -#include "panther_utils/test/test_utils.hpp" +#include "husarion_ugv_utils/test/test_utils.hpp" class TestRoboteqDriver : public ::testing::Test { @@ -44,26 +44,26 @@ class TestRoboteqDriver : public ::testing::Test static constexpr char kMotor1Name[] = "motor_1"; static constexpr char kMotor2Name[] = "motor_2"; - std::unique_ptr can_socket_; - std::unique_ptr mock_roboteq_; - std::unique_ptr canopen_manager_; - std::shared_ptr roboteq_driver_; + std::unique_ptr can_socket_; + std::unique_ptr mock_roboteq_; + std::unique_ptr canopen_manager_; + std::shared_ptr roboteq_driver_; }; TestRoboteqDriver::TestRoboteqDriver() { - can_socket_ = std::make_unique( - panther_hardware_interfaces_test::kCANopenSettings.can_interface_name); + can_socket_ = std::make_unique( + husarion_ugv_hardware_interfaces_test::kCANopenSettings.can_interface_name); can_socket_->Initialize(); - canopen_manager_ = std::make_unique( - panther_hardware_interfaces_test::kCANopenSettings); + canopen_manager_ = std::make_unique( + husarion_ugv_hardware_interfaces_test::kCANopenSettings); - mock_roboteq_ = std::make_unique(); + mock_roboteq_ = std::make_unique(); mock_roboteq_->Start(std::chrono::milliseconds(10), std::chrono::milliseconds(50)); canopen_manager_->Initialize(); - roboteq_driver_ = std::make_shared( + roboteq_driver_ = std::make_shared( canopen_manager_->GetMaster(), 1, std::chrono::milliseconds(100)); canopen_manager_->Activate(); @@ -80,10 +80,10 @@ TestRoboteqDriver::~TestRoboteqDriver() void TestRoboteqDriver::BootRoboteqDriver() { - auto motor_1 = std::make_shared( - roboteq_driver_, panther_hardware_interfaces::RoboteqDriver::kChannel1); - auto motor_2 = std::make_shared( - roboteq_driver_, panther_hardware_interfaces::RoboteqDriver::kChannel2); + auto motor_1 = std::make_shared( + roboteq_driver_, husarion_ugv_hardware_interfaces::RoboteqDriver::kChannel1); + auto motor_2 = std::make_shared( + roboteq_driver_, husarion_ugv_hardware_interfaces::RoboteqDriver::kChannel2); roboteq_driver_->AddMotorDriver(kMotor1Name, motor_1); roboteq_driver_->AddMotorDriver(kMotor2Name, motor_2); @@ -130,7 +130,7 @@ TEST_F(TestRoboteqDriver, BootErrorVendorId) TEST_F(TestRoboteqDriver, ReadRoboteqMotorStates) { - using panther_hardware_interfaces_test::DriverChannel; + using husarion_ugv_hardware_interfaces_test::DriverChannel; const std::int32_t motor_1_pos = 101; const std::int32_t motor_1_vel = 102; @@ -152,9 +152,9 @@ TEST_F(TestRoboteqDriver, ReadRoboteqMotorStates) std::this_thread::sleep_for(std::chrono::milliseconds(10)); - panther_hardware_interfaces::MotorDriverState motor_driver_state_1 = + husarion_ugv_hardware_interfaces::MotorDriverState motor_driver_state_1 = roboteq_driver_->GetMotorDriver(kMotor1Name)->ReadState(); - panther_hardware_interfaces::MotorDriverState motor_driver_state_2 = + husarion_ugv_hardware_interfaces::MotorDriverState motor_driver_state_2 = roboteq_driver_->GetMotorDriver(kMotor2Name)->ReadState(); EXPECT_EQ(motor_driver_state_1.pos, motor_1_pos); @@ -170,13 +170,13 @@ TEST_F(TestRoboteqDriver, ReadRoboteqMotorStatesTimestamps) { BootRoboteqDriver(); - panther_hardware_interfaces::MotorDriverState motor_driver_state_1 = + husarion_ugv_hardware_interfaces::MotorDriverState motor_driver_state_1 = roboteq_driver_->GetMotorDriver(kMotor1Name)->ReadState(); // based on publishing frequency in the Roboteq mock (100Hz) std::this_thread::sleep_for(std::chrono::milliseconds(10)); - panther_hardware_interfaces::MotorDriverState motor_driver_state_2 = + husarion_ugv_hardware_interfaces::MotorDriverState motor_driver_state_2 = roboteq_driver_->GetMotorDriver(kMotor2Name)->ReadState(); // feedback is published with a 100ms period, to check if timestamps are accurate, it is checked @@ -204,10 +204,10 @@ TEST_F(TestRoboteqDriver, ReadRoboteqMotorStatesTimestamps) TEST_F(TestRoboteqDriver, ReadState) { - using panther_hardware_interfaces_test::DriverChannel; - using panther_hardware_interfaces_test::DriverFaultFlags; - using panther_hardware_interfaces_test::DriverRuntimeErrors; - using panther_hardware_interfaces_test::DriverScriptFlags; + using husarion_ugv_hardware_interfaces_test::DriverChannel; + using husarion_ugv_hardware_interfaces_test::DriverFaultFlags; + using husarion_ugv_hardware_interfaces_test::DriverRuntimeErrors; + using husarion_ugv_hardware_interfaces_test::DriverScriptFlags; const std::int16_t temp = 30; const std::int16_t heatsink_temp = 31; @@ -230,7 +230,7 @@ TEST_F(TestRoboteqDriver, ReadState) std::this_thread::sleep_for(std::chrono::milliseconds(50)); - panther_hardware_interfaces::DriverState driver_state = roboteq_driver_->ReadState(); + husarion_ugv_hardware_interfaces::DriverState driver_state = roboteq_driver_->ReadState(); EXPECT_EQ(driver_state.mcu_temp, temp); EXPECT_EQ(driver_state.heatsink_temp, heatsink_temp); @@ -248,12 +248,12 @@ TEST_F(TestRoboteqDriver, ReadStateTimestamp) { BootRoboteqDriver(); - panther_hardware_interfaces::DriverState driver_state_1 = roboteq_driver_->ReadState(); + husarion_ugv_hardware_interfaces::DriverState driver_state_1 = roboteq_driver_->ReadState(); // based on publishing frequency in the Roboteq mock (20Hz) std::this_thread::sleep_for(std::chrono::milliseconds(50)); - panther_hardware_interfaces::DriverState driver_state_2 = roboteq_driver_->ReadState(); + husarion_ugv_hardware_interfaces::DriverState driver_state_2 = roboteq_driver_->ReadState(); // feedback is published with a 100ms period, to check if timestamps are accurate, it is checked // if consecutive messages will have timestamps 100ms + some threshold apart @@ -280,7 +280,7 @@ TEST_F(TestRoboteqDriver, ReadStateTimestamp) TEST_F(TestRoboteqDriver, SendRoboteqCmd) { - using panther_hardware_interfaces_test::DriverChannel; + using husarion_ugv_hardware_interfaces_test::DriverChannel; const std::int32_t motor_1_v = 10; const std::int32_t motor_2_v = 20; @@ -310,7 +310,7 @@ TEST_F(TestRoboteqDriver, ResetRoboteqScriptSDOTimeoutReset) BootRoboteqDriver(); mock_roboteq_->GetDriver()->SetOnWriteWait(0x2018, 0, 100000); - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( [&]() { roboteq_driver_->ResetScript(); }, "SDO protocol timed out")); mock_roboteq_->GetDriver()->SetOnWriteWait(0x2018, 0, 0); @@ -330,7 +330,7 @@ TEST_F(TestRoboteqDriver, TurnOnEStopTimeout) { BootRoboteqDriver(); mock_roboteq_->GetDriver()->SetOnWriteWait(0x200C, 0, 100000); - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( [&]() { roboteq_driver_->TurnOnEStop(); }, "SDO protocol timed out")); } @@ -347,7 +347,7 @@ TEST_F(TestRoboteqDriver, TurnOffEStopTimeout) { BootRoboteqDriver(); mock_roboteq_->GetDriver()->SetOnWriteWait(0x200D, 0, 100000); - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( [&]() { roboteq_driver_->TurnOffEStop(); }, "SDO protocol timed out")); } @@ -373,7 +373,7 @@ TEST_F(TestRoboteqDriver, WriteTimeout) { BootRoboteqDriver(); mock_roboteq_->GetDriver()->SetOnWriteWait(0x202C, 0, 200000); - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( [&]() { roboteq_driver_->GetMotorDriver(kMotor1Name)->TurnOnSafetyStop(); }, "SDO protocol timed out")); } diff --git a/panther_hardware_interfaces/test/unit/panther_system/robot_driver/test_roboteq_error_filter.cpp b/husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_roboteq_error_filter.cpp similarity index 87% rename from panther_hardware_interfaces/test/unit/panther_system/robot_driver/test_roboteq_error_filter.cpp rename to husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_roboteq_error_filter.cpp index cd3d65661..d02199718 100644 --- a/panther_hardware_interfaces/test/unit/panther_system/robot_driver/test_roboteq_error_filter.cpp +++ b/husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_roboteq_error_filter.cpp @@ -14,13 +14,13 @@ #include -#include +#include TEST(TestRoboteqErrorFilter, InitialState) { - using panther_hardware_interfaces::ErrorsFilterIds; + using husarion_ugv_hardware_interfaces::ErrorsFilterIds; - panther_hardware_interfaces::RoboteqErrorFilter roboteq_error_filter(2, 2, 1, 1); + husarion_ugv_hardware_interfaces::RoboteqErrorFilter roboteq_error_filter(2, 2, 1, 1); ASSERT_FALSE(roboteq_error_filter.IsError()); EXPECT_FALSE(roboteq_error_filter.IsError(ErrorsFilterIds::WRITE_PDO_CMDS)); @@ -31,9 +31,9 @@ TEST(TestRoboteqErrorFilter, InitialState) TEST(TestRoboteqErrorFilter, FilterError) { - using panther_hardware_interfaces::ErrorsFilterIds; + using husarion_ugv_hardware_interfaces::ErrorsFilterIds; - panther_hardware_interfaces::RoboteqErrorFilter roboteq_error_filter(2, 2, 1, 1); + husarion_ugv_hardware_interfaces::RoboteqErrorFilter roboteq_error_filter(2, 2, 1, 1); roboteq_error_filter.UpdateError(ErrorsFilterIds::WRITE_PDO_CMDS, true); @@ -62,9 +62,9 @@ TEST(TestRoboteqErrorFilter, FilterError) TEST(TestRoboteqErrorFilter, Error) { - using panther_hardware_interfaces::ErrorsFilterIds; + using husarion_ugv_hardware_interfaces::ErrorsFilterIds; - panther_hardware_interfaces::RoboteqErrorFilter roboteq_error_filter(2, 2, 1, 1); + husarion_ugv_hardware_interfaces::RoboteqErrorFilter roboteq_error_filter(2, 2, 1, 1); roboteq_error_filter.UpdateError(ErrorsFilterIds::WRITE_PDO_CMDS, true); @@ -85,9 +85,9 @@ TEST(TestRoboteqErrorFilter, Error) TEST(TestRoboteqErrorFilter, FilterSecondError) { - using panther_hardware_interfaces::ErrorsFilterIds; + using husarion_ugv_hardware_interfaces::ErrorsFilterIds; - panther_hardware_interfaces::RoboteqErrorFilter roboteq_error_filter(2, 2, 1, 1); + husarion_ugv_hardware_interfaces::RoboteqErrorFilter roboteq_error_filter(2, 2, 1, 1); roboteq_error_filter.UpdateError(ErrorsFilterIds::READ_PDO_MOTOR_STATES, true); @@ -116,9 +116,9 @@ TEST(TestRoboteqErrorFilter, FilterSecondError) TEST(TestRoboteqErrorFilter, SecondError) { - using panther_hardware_interfaces::ErrorsFilterIds; + using husarion_ugv_hardware_interfaces::ErrorsFilterIds; - panther_hardware_interfaces::RoboteqErrorFilter roboteq_error_filter(2, 2, 1, 1); + husarion_ugv_hardware_interfaces::RoboteqErrorFilter roboteq_error_filter(2, 2, 1, 1); roboteq_error_filter.UpdateError(ErrorsFilterIds::READ_PDO_MOTOR_STATES, true); @@ -139,9 +139,9 @@ TEST(TestRoboteqErrorFilter, SecondError) TEST(TestRoboteqErrorFilter, ErrorSingle) { - using panther_hardware_interfaces::ErrorsFilterIds; + using husarion_ugv_hardware_interfaces::ErrorsFilterIds; - panther_hardware_interfaces::RoboteqErrorFilter roboteq_error_filter(2, 2, 1, 1); + husarion_ugv_hardware_interfaces::RoboteqErrorFilter roboteq_error_filter(2, 2, 1, 1); roboteq_error_filter.UpdateError(ErrorsFilterIds::READ_PDO_DRIVER_STATE, true); @@ -154,9 +154,9 @@ TEST(TestRoboteqErrorFilter, ErrorSingle) TEST(TestRoboteqErrorFilter, ClearErrors) { - using panther_hardware_interfaces::ErrorsFilterIds; + using husarion_ugv_hardware_interfaces::ErrorsFilterIds; - panther_hardware_interfaces::RoboteqErrorFilter roboteq_error_filter(2, 2, 1, 1); + husarion_ugv_hardware_interfaces::RoboteqErrorFilter roboteq_error_filter(2, 2, 1, 1); roboteq_error_filter.UpdateError(ErrorsFilterIds::WRITE_PDO_CMDS, true); roboteq_error_filter.UpdateError(ErrorsFilterIds::WRITE_PDO_CMDS, true); @@ -187,9 +187,9 @@ TEST(TestRoboteqErrorFilter, ClearErrors) TEST(TestRoboteqErrorFilter, ClearErrorsCounters) { - using panther_hardware_interfaces::ErrorsFilterIds; + using husarion_ugv_hardware_interfaces::ErrorsFilterIds; - panther_hardware_interfaces::RoboteqErrorFilter roboteq_error_filter(2, 2, 1, 1); + husarion_ugv_hardware_interfaces::RoboteqErrorFilter roboteq_error_filter(2, 2, 1, 1); roboteq_error_filter.UpdateError(ErrorsFilterIds::WRITE_PDO_CMDS, true); roboteq_error_filter.UpdateError(ErrorsFilterIds::READ_PDO_MOTOR_STATES, true); diff --git a/panther_hardware_interfaces/test/unit/panther_system/robot_driver/test_roboteq_robot_driver.cpp b/husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_roboteq_robot_driver.cpp similarity index 81% rename from panther_hardware_interfaces/test/unit/panther_system/robot_driver/test_roboteq_robot_driver.cpp rename to husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_roboteq_robot_driver.cpp index 714de2d9e..77783d45f 100644 --- a/panther_hardware_interfaces/test/unit/panther_system/robot_driver/test_roboteq_robot_driver.cpp +++ b/husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_roboteq_robot_driver.cpp @@ -22,41 +22,43 @@ #include -#include "panther_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp" -#include "panther_hardware_interfaces/panther_system/robot_driver/driver.hpp" -#include "panther_hardware_interfaces/panther_system/robot_driver/robot_driver.hpp" -#include "panther_hardware_interfaces/panther_system/robot_driver/roboteq_robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/driver.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_robot_driver.hpp" #include "utils/fake_can_socket.hpp" #include "utils/mock_driver.hpp" #include "utils/test_constants.hpp" -#include "panther_utils/test/test_utils.hpp" +#include "husarion_ugv_utils/test/test_utils.hpp" -class RoboteqRobotDriverWrapper : public panther_hardware_interfaces::RoboteqRobotDriver +class RoboteqRobotDriverWrapper : public husarion_ugv_hardware_interfaces::RoboteqRobotDriver { public: RoboteqRobotDriverWrapper( - const panther_hardware_interfaces::CANopenSettings & canopen_settings, - const panther_hardware_interfaces::DrivetrainSettings & drivetrain_settings, + const husarion_ugv_hardware_interfaces::CANopenSettings & canopen_settings, + const husarion_ugv_hardware_interfaces::DrivetrainSettings & drivetrain_settings, const std::chrono::milliseconds activate_wait_time = std::chrono::milliseconds(1000)) : RoboteqRobotDriver(canopen_settings, drivetrain_settings, activate_wait_time) { // Assume 2 drivers and 4 motor drivers mock_fl_motor_driver = - std::make_shared(); + std::make_shared(); mock_fr_motor_driver = - std::make_shared(); + std::make_shared(); mock_rl_motor_driver = - std::make_shared(); + std::make_shared(); mock_rr_motor_driver = - std::make_shared(); + std::make_shared(); - mock_front_driver = std::make_shared(); + mock_front_driver = + std::make_shared(); mock_front_driver->AddMotorDriver(kLeftMotorDriverName, mock_fl_motor_driver); mock_front_driver->AddMotorDriver(kRightMotorDriverName, mock_fr_motor_driver); - mock_rear_driver = std::make_shared(); + mock_rear_driver = + std::make_shared(); mock_rear_driver->AddMotorDriver(kLeftMotorDriverName, mock_rl_motor_driver); mock_rear_driver->AddMotorDriver(kRightMotorDriverName, mock_rr_motor_driver); } @@ -75,12 +77,16 @@ class RoboteqRobotDriverWrapper : public panther_hardware_interfaces::RoboteqRob static constexpr char kLeftMotorDriverName[] = "left"; static constexpr char kRightMotorDriverName[] = "right"; - std::shared_ptr mock_front_driver; - std::shared_ptr mock_rear_driver; - std::shared_ptr mock_fl_motor_driver; - std::shared_ptr mock_fr_motor_driver; - std::shared_ptr mock_rl_motor_driver; - std::shared_ptr mock_rr_motor_driver; + std::shared_ptr mock_front_driver; + std::shared_ptr mock_rear_driver; + std::shared_ptr + mock_fl_motor_driver; + std::shared_ptr + mock_fr_motor_driver; + std::shared_ptr + mock_rl_motor_driver; + std::shared_ptr + mock_rr_motor_driver; }; class TestRoboteqRobotDriverInitialization : public ::testing::Test @@ -88,19 +94,19 @@ class TestRoboteqRobotDriverInitialization : public ::testing::Test public: TestRoboteqRobotDriverInitialization() { - can_socket_ = std::make_unique( - panther_hardware_interfaces_test::kCANopenSettings.can_interface_name); + can_socket_ = std::make_unique( + husarion_ugv_hardware_interfaces_test::kCANopenSettings.can_interface_name); can_socket_->Initialize(); robot_driver_ = std::make_unique( - panther_hardware_interfaces_test::kCANopenSettings, - panther_hardware_interfaces_test::kDrivetrainSettings, std::chrono::milliseconds(10)); + husarion_ugv_hardware_interfaces_test::kCANopenSettings, + husarion_ugv_hardware_interfaces_test::kDrivetrainSettings, std::chrono::milliseconds(10)); } ~TestRoboteqRobotDriverInitialization() {} protected: - std::unique_ptr can_socket_; + std::unique_ptr can_socket_; std::unique_ptr robot_driver_; }; @@ -164,7 +170,7 @@ TEST_F(TestRoboteqRobotDriver, GetDataError) const std::string name = "invalid_name"; const std::string error_msg = "Data with name '" + name + "' does not exist."; - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( [&] { robot_driver_->GetData(name); }, error_msg)); } @@ -206,10 +212,10 @@ TEST_F(TestRoboteqRobotDriver, UpdateCommunicationStateHeartbeatTimeout) TEST_F(TestRoboteqRobotDriver, UpdateMotorsState) { - using panther_hardware_interfaces::MotorChannels; - using panther_hardware_interfaces_test::kRbtqCurrentFbToNewtonMeters; - using panther_hardware_interfaces_test::kRbtqPosFbToRad; - using panther_hardware_interfaces_test::kRbtqVelFbToRadPerSec; + using husarion_ugv_hardware_interfaces::MotorChannels; + using husarion_ugv_hardware_interfaces_test::kRbtqCurrentFbToNewtonMeters; + using husarion_ugv_hardware_interfaces_test::kRbtqPosFbToRad; + using husarion_ugv_hardware_interfaces_test::kRbtqVelFbToRadPerSec; const std::int32_t fl_pos = 101; const std::int32_t fl_vel = 102; @@ -225,17 +231,17 @@ TEST_F(TestRoboteqRobotDriver, UpdateMotorsState) const std::int32_t rr_current = 403; ON_CALL(*robot_driver_->mock_fl_motor_driver, ReadState()) - .WillByDefault(::testing::Return( - panther_hardware_interfaces::MotorDriverState({fl_pos, fl_vel, fl_current, {0, 0}, {0, 0}}))); + .WillByDefault(::testing::Return(husarion_ugv_hardware_interfaces::MotorDriverState( + {fl_pos, fl_vel, fl_current, {0, 0}, {0, 0}}))); ON_CALL(*robot_driver_->mock_fr_motor_driver, ReadState()) - .WillByDefault(::testing::Return( - panther_hardware_interfaces::MotorDriverState({fr_pos, fr_vel, fr_current, {0, 0}, {0, 0}}))); + .WillByDefault(::testing::Return(husarion_ugv_hardware_interfaces::MotorDriverState( + {fr_pos, fr_vel, fr_current, {0, 0}, {0, 0}}))); ON_CALL(*robot_driver_->mock_rl_motor_driver, ReadState()) - .WillByDefault(::testing::Return( - panther_hardware_interfaces::MotorDriverState({rl_pos, rl_vel, rl_current, {0, 0}, {0, 0}}))); + .WillByDefault(::testing::Return(husarion_ugv_hardware_interfaces::MotorDriverState( + {rl_pos, rl_vel, rl_current, {0, 0}, {0, 0}}))); ON_CALL(*robot_driver_->mock_rr_motor_driver, ReadState()) - .WillByDefault(::testing::Return( - panther_hardware_interfaces::MotorDriverState({rr_pos, rr_vel, rr_current, {0, 0}, {0, 0}}))); + .WillByDefault(::testing::Return(husarion_ugv_hardware_interfaces::MotorDriverState( + {rr_pos, rr_vel, rr_current, {0, 0}, {0, 0}}))); robot_driver_->UpdateMotorsState(); @@ -268,10 +274,10 @@ TEST_F(TestRoboteqRobotDriver, UpdateMotorsState) TEST_F(TestRoboteqRobotDriver, UpdateMotorsStateTimestamps) { auto current_time = GetCurrentTimeWithTimeout( - panther_hardware_interfaces_test::kCANopenSettings.pdo_motor_states_timeout_ms); + husarion_ugv_hardware_interfaces_test::kCANopenSettings.pdo_motor_states_timeout_ms); auto read_motor_driver_state_method = [¤t_time]() { - panther_hardware_interfaces::MotorDriverState state; + husarion_ugv_hardware_interfaces::MotorDriverState state; state.pos_timestamp = current_time; state.vel_current_timestamp = current_time; return state; @@ -302,9 +308,9 @@ TEST_F(TestRoboteqRobotDriver, UpdateMotorsStateTimestamps) TEST_F(TestRoboteqRobotDriver, UpdateMotorsStateTimeout) { const auto current_time = GetCurrentTimeWithTimeout( - panther_hardware_interfaces_test::kCANopenSettings.pdo_motor_states_timeout_ms); + husarion_ugv_hardware_interfaces_test::kCANopenSettings.pdo_motor_states_timeout_ms); - panther_hardware_interfaces::MotorDriverState state = {0, 0, 0, current_time, current_time}; + husarion_ugv_hardware_interfaces::MotorDriverState state = {0, 0, 0, current_time, current_time}; ON_CALL(*robot_driver_->mock_fl_motor_driver, ReadState()) .WillByDefault(::testing::Return(state)); @@ -327,7 +333,7 @@ TEST_F(TestRoboteqRobotDriver, UpdateMotorsStateTimeout) TEST_F(TestRoboteqRobotDriver, UpdateDriverState) { - using panther_hardware_interfaces::MotorChannels; + using husarion_ugv_hardware_interfaces::MotorChannels; const std::int16_t f_temp = 30; const std::int16_t r_temp = 32; @@ -349,7 +355,7 @@ TEST_F(TestRoboteqRobotDriver, UpdateDriverState) const std::uint8_t runtime_error_forward_limit_triggered = static_cast(0b10000); const std::uint8_t runtime_error_reverse_limit_triggered = static_cast(0b100000); - panther_hardware_interfaces::DriverState front_driver_state_data = { + husarion_ugv_hardware_interfaces::DriverState front_driver_state_data = { fault_flag_overheat, script_flag_encoder_disconnected, runtime_error_loop_error, @@ -362,7 +368,7 @@ TEST_F(TestRoboteqRobotDriver, UpdateDriverState) {0, 0}, {0, 0}}; - panther_hardware_interfaces::DriverState rear_driver_state_data = { + husarion_ugv_hardware_interfaces::DriverState rear_driver_state_data = { fault_flag_overvoltage, script_flag_amp_limiter, runtime_error_forward_limit_triggered, @@ -377,10 +383,10 @@ TEST_F(TestRoboteqRobotDriver, UpdateDriverState) ON_CALL(*robot_driver_->mock_front_driver, ReadState()) .WillByDefault( - ::testing::Return(panther_hardware_interfaces::DriverState(front_driver_state_data))); + ::testing::Return(husarion_ugv_hardware_interfaces::DriverState(front_driver_state_data))); ON_CALL(*robot_driver_->mock_rear_driver, ReadState()) .WillByDefault( - ::testing::Return(panther_hardware_interfaces::DriverState(rear_driver_state_data))); + ::testing::Return(husarion_ugv_hardware_interfaces::DriverState(rear_driver_state_data))); robot_driver_->UpdateDriversState(); @@ -420,10 +426,10 @@ TEST_F(TestRoboteqRobotDriver, UpdateDriverState) TEST_F(TestRoboteqRobotDriver, UpdateDriverStateTimestamps) { auto current_time = GetCurrentTimeWithTimeout( - panther_hardware_interfaces_test::kCANopenSettings.pdo_driver_state_timeout_ms); + husarion_ugv_hardware_interfaces_test::kCANopenSettings.pdo_driver_state_timeout_ms); auto read_driver_state_method = [¤t_time]() { - panther_hardware_interfaces::DriverState state; + husarion_ugv_hardware_interfaces::DriverState state; state.flags_current_timestamp = current_time; state.voltages_temps_timestamp = current_time; return state; @@ -450,9 +456,9 @@ TEST_F(TestRoboteqRobotDriver, UpdateDriverStateTimestamps) TEST_F(TestRoboteqRobotDriver, UpdateDriverStateTimeout) { const auto current_time = GetCurrentTimeWithTimeout( - panther_hardware_interfaces_test::kCANopenSettings.pdo_driver_state_timeout_ms); + husarion_ugv_hardware_interfaces_test::kCANopenSettings.pdo_driver_state_timeout_ms); - panther_hardware_interfaces::DriverState state = { + husarion_ugv_hardware_interfaces::DriverState state = { 0, 0, 0, 0, 0, 0, 0, 0, 0, current_time, current_time}; ON_CALL(*robot_driver_->mock_front_driver, ReadState()).WillByDefault(::testing::Return(state)); diff --git a/panther_hardware_interfaces/test/unit/panther_system/test_lynx_system.cpp b/husarion_ugv_hardware_interfaces/test/unit/panther_system/test_lynx_system.cpp similarity index 64% rename from panther_hardware_interfaces/test/unit/panther_system/test_lynx_system.cpp rename to husarion_ugv_hardware_interfaces/test/unit/panther_system/test_lynx_system.cpp index ed1ecd650..8f735d4ca 100644 --- a/panther_hardware_interfaces/test/unit/panther_system/test_lynx_system.cpp +++ b/husarion_ugv_hardware_interfaces/test/unit/panther_system/test_lynx_system.cpp @@ -22,22 +22,22 @@ #include -#include "panther_hardware_interfaces/panther_system/lynx_system.hpp" -#include "panther_hardware_interfaces/panther_system/robot_driver/roboteq_robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/lynx_system.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_robot_driver.hpp" #include "utils/system_test_utils.hpp" #include "utils/test_constants.hpp" -class LynxSystemWrapper : public panther_hardware_interfaces::LynxSystem +class LynxSystemWrapper : public husarion_ugv_hardware_interfaces::LynxSystem { public: LynxSystemWrapper() : LynxSystem() { mock_robot_driver = - std::make_shared(); + std::make_shared(); mock_gpio_controller = - std::make_shared(); - mock_e_stop = std::make_shared(); + std::make_shared(); + mock_e_stop = std::make_shared(); } void DefineRobotDriver() override { robot_driver_ = mock_robot_driver; } @@ -61,20 +61,24 @@ class LynxSystemWrapper : public panther_hardware_interfaces::LynxSystem hw_commands_velocities_[3] = velocities[3]; } - panther_hardware_interfaces::CANopenSettings GetCANopenSettings() { return canopen_settings_; } + husarion_ugv_hardware_interfaces::CANopenSettings GetCANopenSettings() + { + return canopen_settings_; + } std::vector GetHwStatesPositions() { return hw_states_positions_; } std::vector GetHwStatesVelocities() { return hw_states_velocities_; } std::vector GetHwStatesEfforts() { return hw_states_efforts_; } - std::shared_ptr GetRoboteqErrorFilter() + std::shared_ptr GetRoboteqErrorFilter() { return roboteq_error_filter_; } - std::shared_ptr mock_robot_driver; - std::shared_ptr + std::shared_ptr + mock_robot_driver; + std::shared_ptr mock_gpio_controller; - std::shared_ptr mock_e_stop; + std::shared_ptr mock_e_stop; }; class TestLynxSystem : public ::testing::Test @@ -84,7 +88,7 @@ class TestLynxSystem : public ::testing::Test { lynx_system_ = std::make_shared(); - hardware_info_ = panther_hardware_interfaces_test::GenerateDefaultHardwareInfo(); + hardware_info_ = husarion_ugv_hardware_interfaces_test::GenerateDefaultHardwareInfo(); hardware_info_.hardware_parameters.emplace("driver_can_id", "1"); lynx_system_->on_init(hardware_info_); @@ -106,7 +110,7 @@ TEST_F(TestLynxSystem, ReadCANopenSettingsDriverCANIDs) EXPECT_EQ(canopen_settings.driver_can_ids.size(), 1); EXPECT_EQ( - canopen_settings.driver_can_ids.at(panther_hardware_interfaces::DriverNames::DEFAULT), 1); + canopen_settings.driver_can_ids.at(husarion_ugv_hardware_interfaces::DriverNames::DEFAULT), 1); } TEST_F(TestLynxSystem, UpdateHwStates) @@ -118,29 +122,31 @@ TEST_F(TestLynxSystem, UpdateHwStates) const std::int16_t right_vel = 50; const std::int16_t right_eff = 60; - const auto left_expected_pos = left_pos * panther_hardware_interfaces_test::kRbtqPosFbToRad; - const auto left_expected_vel = left_vel * panther_hardware_interfaces_test::kRbtqVelFbToRadPerSec; - const auto left_expected_eff = left_eff * - panther_hardware_interfaces_test::kRbtqCurrentFbToNewtonMeters; - const auto right_expected_pos = right_pos * panther_hardware_interfaces_test::kRbtqPosFbToRad; + const auto left_expected_pos = left_pos * husarion_ugv_hardware_interfaces_test::kRbtqPosFbToRad; + const auto left_expected_vel = left_vel * + husarion_ugv_hardware_interfaces_test::kRbtqVelFbToRadPerSec; + const auto left_expected_eff = + left_eff * husarion_ugv_hardware_interfaces_test::kRbtqCurrentFbToNewtonMeters; + const auto right_expected_pos = right_pos * + husarion_ugv_hardware_interfaces_test::kRbtqPosFbToRad; const auto right_expected_vel = right_vel * - panther_hardware_interfaces_test::kRbtqVelFbToRadPerSec; - const auto right_expected_eff = right_eff * - panther_hardware_interfaces_test::kRbtqCurrentFbToNewtonMeters; + husarion_ugv_hardware_interfaces_test::kRbtqVelFbToRadPerSec; + const auto right_expected_eff = + right_eff * husarion_ugv_hardware_interfaces_test::kRbtqCurrentFbToNewtonMeters; - panther_hardware_interfaces::MotorDriverState left_motor_driver_state = { + husarion_ugv_hardware_interfaces::MotorDriverState left_motor_driver_state = { left_pos, left_vel, left_eff, {0, 0}, {0, 0}}; - panther_hardware_interfaces::MotorDriverState right_motor_driver_state = { + husarion_ugv_hardware_interfaces::MotorDriverState right_motor_driver_state = { right_pos, right_vel, right_eff, {0, 0}, {0, 0}}; - panther_hardware_interfaces::DriverData roboteq_data( - panther_hardware_interfaces_test::kDrivetrainSettings); + husarion_ugv_hardware_interfaces::DriverData roboteq_data( + husarion_ugv_hardware_interfaces_test::kDrivetrainSettings); // left - channel 2, right - channel 1 roboteq_data.SetMotorsStates(right_motor_driver_state, left_motor_driver_state, false); EXPECT_CALL( *lynx_system_->mock_robot_driver, - GetData(::testing::Eq(panther_hardware_interfaces::DriverNames::DEFAULT))) + GetData(::testing::Eq(husarion_ugv_hardware_interfaces::DriverNames::DEFAULT))) .WillOnce(::testing::ReturnRef(roboteq_data)); ASSERT_NO_THROW(lynx_system_->UpdateHwStates()); @@ -163,22 +169,22 @@ TEST_F(TestLynxSystem, UpdateHwStates) TEST_F(TestLynxSystem, UpdateMotorsStateDataTimedOut) { - panther_hardware_interfaces::MotorDriverState motor_driver_state; + husarion_ugv_hardware_interfaces::MotorDriverState motor_driver_state; - panther_hardware_interfaces::DriverData roboteq_data( - panther_hardware_interfaces_test::kDrivetrainSettings); + husarion_ugv_hardware_interfaces::DriverData roboteq_data( + husarion_ugv_hardware_interfaces_test::kDrivetrainSettings); roboteq_data.SetMotorsStates(motor_driver_state, motor_driver_state, true); EXPECT_CALL( *lynx_system_->mock_robot_driver, - GetData(::testing::Eq(panther_hardware_interfaces::DriverNames::DEFAULT))) + GetData(::testing::Eq(husarion_ugv_hardware_interfaces::DriverNames::DEFAULT))) .WillOnce(::testing::ReturnRef(roboteq_data)); lynx_system_->UpdateMotorsStateDataTimedOut(); auto error_map = lynx_system_->GetRoboteqErrorFilter()->GetErrorMap(); - auto error = error_map.at(panther_hardware_interfaces::error_filter_id_names.at( - panther_hardware_interfaces::ErrorsFilterIds::READ_PDO_MOTOR_STATES)); + auto error = error_map.at(husarion_ugv_hardware_interfaces::error_filter_id_names.at( + husarion_ugv_hardware_interfaces::ErrorsFilterIds::READ_PDO_MOTOR_STATES)); EXPECT_TRUE(error); @@ -187,15 +193,15 @@ TEST_F(TestLynxSystem, UpdateMotorsStateDataTimedOut) EXPECT_CALL( *lynx_system_->mock_robot_driver, - GetData(::testing::Eq(panther_hardware_interfaces::DriverNames::DEFAULT))) + GetData(::testing::Eq(husarion_ugv_hardware_interfaces::DriverNames::DEFAULT))) .WillOnce(::testing::ReturnRef(roboteq_data)); lynx_system_->GetRoboteqErrorFilter()->SetClearErrorsFlag(); lynx_system_->UpdateMotorsStateDataTimedOut(); error_map = lynx_system_->GetRoboteqErrorFilter()->GetErrorMap(); - error = error_map.at(panther_hardware_interfaces::error_filter_id_names.at( - panther_hardware_interfaces::ErrorsFilterIds::READ_PDO_MOTOR_STATES)); + error = error_map.at(husarion_ugv_hardware_interfaces::error_filter_id_names.at( + husarion_ugv_hardware_interfaces::ErrorsFilterIds::READ_PDO_MOTOR_STATES)); EXPECT_FALSE(error); } @@ -208,23 +214,23 @@ TEST_F(TestLynxSystem, UpdateDriverStateMsg) TEST_F(TestLynxSystem, UpdateFlagErrors) { - auto driver_state = panther_hardware_interfaces::DriverState(); + auto driver_state = husarion_ugv_hardware_interfaces::DriverState(); driver_state.fault_flags = 0b01; - panther_hardware_interfaces::DriverData roboteq_data( - panther_hardware_interfaces_test::kDrivetrainSettings); + husarion_ugv_hardware_interfaces::DriverData roboteq_data( + husarion_ugv_hardware_interfaces_test::kDrivetrainSettings); roboteq_data.SetDriverState(driver_state, false); EXPECT_CALL( *lynx_system_->mock_robot_driver, - GetData(::testing::Eq(panther_hardware_interfaces::DriverNames::DEFAULT))) + GetData(::testing::Eq(husarion_ugv_hardware_interfaces::DriverNames::DEFAULT))) .WillOnce(::testing::ReturnRef(roboteq_data)); lynx_system_->UpdateFlagErrors(); auto error_map = lynx_system_->GetRoboteqErrorFilter()->GetErrorMap(); - auto error = error_map.at(panther_hardware_interfaces::error_filter_id_names.at( - panther_hardware_interfaces::ErrorsFilterIds::ROBOTEQ_DRIVER)); + auto error = error_map.at(husarion_ugv_hardware_interfaces::error_filter_id_names.at( + husarion_ugv_hardware_interfaces::ErrorsFilterIds::ROBOTEQ_DRIVER)); EXPECT_TRUE(error); @@ -234,37 +240,37 @@ TEST_F(TestLynxSystem, UpdateFlagErrors) EXPECT_CALL( *lynx_system_->mock_robot_driver, - GetData(::testing::Eq(panther_hardware_interfaces::DriverNames::DEFAULT))) + GetData(::testing::Eq(husarion_ugv_hardware_interfaces::DriverNames::DEFAULT))) .WillOnce(::testing::ReturnRef(roboteq_data)); lynx_system_->GetRoboteqErrorFilter()->SetClearErrorsFlag(); lynx_system_->UpdateFlagErrors(); error_map = lynx_system_->GetRoboteqErrorFilter()->GetErrorMap(); - error = error_map.at(panther_hardware_interfaces::error_filter_id_names.at( - panther_hardware_interfaces::ErrorsFilterIds::ROBOTEQ_DRIVER)); + error = error_map.at(husarion_ugv_hardware_interfaces::error_filter_id_names.at( + husarion_ugv_hardware_interfaces::ErrorsFilterIds::ROBOTEQ_DRIVER)); EXPECT_FALSE(error); } TEST_F(TestLynxSystem, UpdateDriverStateDataTimedOut) { - panther_hardware_interfaces::DriverState driver_state; + husarion_ugv_hardware_interfaces::DriverState driver_state; - panther_hardware_interfaces::DriverData roboteq_data( - panther_hardware_interfaces_test::kDrivetrainSettings); + husarion_ugv_hardware_interfaces::DriverData roboteq_data( + husarion_ugv_hardware_interfaces_test::kDrivetrainSettings); roboteq_data.SetDriverState(driver_state, true); EXPECT_CALL( *lynx_system_->mock_robot_driver, - GetData(::testing::Eq(panther_hardware_interfaces::DriverNames::DEFAULT))) + GetData(::testing::Eq(husarion_ugv_hardware_interfaces::DriverNames::DEFAULT))) .WillOnce(::testing::ReturnRef(roboteq_data)); lynx_system_->UpdateDriverStateDataTimedOut(); auto error_map = lynx_system_->GetRoboteqErrorFilter()->GetErrorMap(); - auto error = error_map.at(panther_hardware_interfaces::error_filter_id_names.at( - panther_hardware_interfaces::ErrorsFilterIds::READ_PDO_DRIVER_STATE)); + auto error = error_map.at(husarion_ugv_hardware_interfaces::error_filter_id_names.at( + husarion_ugv_hardware_interfaces::ErrorsFilterIds::READ_PDO_DRIVER_STATE)); EXPECT_TRUE(error); @@ -273,15 +279,15 @@ TEST_F(TestLynxSystem, UpdateDriverStateDataTimedOut) EXPECT_CALL( *lynx_system_->mock_robot_driver, - GetData(::testing::Eq(panther_hardware_interfaces::DriverNames::DEFAULT))) + GetData(::testing::Eq(husarion_ugv_hardware_interfaces::DriverNames::DEFAULT))) .WillOnce(::testing::ReturnRef(roboteq_data)); lynx_system_->GetRoboteqErrorFilter()->SetClearErrorsFlag(); lynx_system_->UpdateDriverStateDataTimedOut(); error_map = lynx_system_->GetRoboteqErrorFilter()->GetErrorMap(); - error = error_map.at(panther_hardware_interfaces::error_filter_id_names.at( - panther_hardware_interfaces::ErrorsFilterIds::READ_PDO_DRIVER_STATE)); + error = error_map.at(husarion_ugv_hardware_interfaces::error_filter_id_names.at( + husarion_ugv_hardware_interfaces::ErrorsFilterIds::READ_PDO_DRIVER_STATE)); EXPECT_FALSE(error); } diff --git a/panther_hardware_interfaces/test/unit/panther_system/test_panther_system.cpp b/husarion_ugv_hardware_interfaces/test/unit/panther_system/test_panther_system.cpp similarity index 59% rename from panther_hardware_interfaces/test/unit/panther_system/test_panther_system.cpp rename to husarion_ugv_hardware_interfaces/test/unit/panther_system/test_panther_system.cpp index f75704ef0..4f48e28be 100644 --- a/panther_hardware_interfaces/test/unit/panther_system/test_panther_system.cpp +++ b/husarion_ugv_hardware_interfaces/test/unit/panther_system/test_panther_system.cpp @@ -22,28 +22,30 @@ #include -#include "panther_hardware_interfaces/panther_system/panther_system.hpp" -#include "panther_hardware_interfaces/panther_system/robot_driver/roboteq_robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/panther_system.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_robot_driver.hpp" #include "utils/system_test_utils.hpp" #include "utils/test_constants.hpp" -class PantherSystemWrapper : public panther_hardware_interfaces::PantherSystem +class PantherSystemWrapper : public husarion_ugv_hardware_interfaces::PantherSystem { public: PantherSystemWrapper() : PantherSystem() { mock_robot_driver = - std::make_shared(); + std::make_shared(); mock_gpio_controller = - std::make_shared(); - mock_e_stop = std::make_shared(); + std::make_shared(); + mock_e_stop = std::make_shared(); ON_CALL( - *mock_robot_driver, GetData(::testing::Eq(panther_hardware_interfaces::DriverNames::FRONT))) + *mock_robot_driver, + GetData(::testing::Eq(husarion_ugv_hardware_interfaces::DriverNames::FRONT))) .WillByDefault(::testing::ReturnRef(default_driver_data)); ON_CALL( - *mock_robot_driver, GetData(::testing::Eq(panther_hardware_interfaces::DriverNames::REAR))) + *mock_robot_driver, + GetData(::testing::Eq(husarion_ugv_hardware_interfaces::DriverNames::REAR))) .WillByDefault(::testing::ReturnRef(default_driver_data)); } @@ -68,24 +70,29 @@ class PantherSystemWrapper : public panther_hardware_interfaces::PantherSystem hw_commands_velocities_[3] = velocities[3]; } - panther_hardware_interfaces::CANopenSettings GetCANopenSettings() { return canopen_settings_; } + husarion_ugv_hardware_interfaces::CANopenSettings GetCANopenSettings() + { + return canopen_settings_; + } std::vector GetHwStatesPositions() { return hw_states_positions_; } std::vector GetHwStatesVelocities() { return hw_states_velocities_; } std::vector GetHwStatesEfforts() { return hw_states_efforts_; } - std::shared_ptr GetRoboteqErrorFilter() + std::shared_ptr GetRoboteqErrorFilter() { return roboteq_error_filter_; } - std::shared_ptr mock_robot_driver; - std::shared_ptr + std::shared_ptr + mock_robot_driver; + std::shared_ptr mock_gpio_controller; - std::shared_ptr mock_e_stop; + std::shared_ptr mock_e_stop; private: - panther_hardware_interfaces::DriverData default_driver_data = - panther_hardware_interfaces::DriverData(panther_hardware_interfaces_test::kDrivetrainSettings); + husarion_ugv_hardware_interfaces::DriverData default_driver_data = + husarion_ugv_hardware_interfaces::DriverData( + husarion_ugv_hardware_interfaces_test::kDrivetrainSettings); }; class TestPantherSystem : public ::testing::Test @@ -95,7 +102,7 @@ class TestPantherSystem : public ::testing::Test { panther_system_ = std::make_shared(); - hardware_info_ = panther_hardware_interfaces_test::GenerateDefaultHardwareInfo(); + hardware_info_ = husarion_ugv_hardware_interfaces_test::GenerateDefaultHardwareInfo(); hardware_info_.hardware_parameters.emplace("front_driver_can_id", "1"); hardware_info_.hardware_parameters.emplace("rear_driver_can_id", "2"); @@ -117,8 +124,10 @@ TEST_F(TestPantherSystem, ReadCANopenSettingsDriverCANIDs) const auto canopen_settings = panther_system_->GetCANopenSettings(); EXPECT_EQ(canopen_settings.driver_can_ids.size(), 2); - EXPECT_EQ(canopen_settings.driver_can_ids.at(panther_hardware_interfaces::DriverNames::FRONT), 1); - EXPECT_EQ(canopen_settings.driver_can_ids.at(panther_hardware_interfaces::DriverNames::REAR), 2); + EXPECT_EQ( + canopen_settings.driver_can_ids.at(husarion_ugv_hardware_interfaces::DriverNames::FRONT), 1); + EXPECT_EQ( + canopen_settings.driver_can_ids.at(husarion_ugv_hardware_interfaces::DriverNames::REAR), 2); } TEST_F(TestPantherSystem, UpdateHwStates) @@ -136,47 +145,51 @@ TEST_F(TestPantherSystem, UpdateHwStates) const std::int16_t rr_vel = 110; const std::int16_t rr_eff = 120; - const auto fl_expected_pos = fl_pos * panther_hardware_interfaces_test::kRbtqPosFbToRad; - const auto fl_expected_vel = fl_vel * panther_hardware_interfaces_test::kRbtqVelFbToRadPerSec; + const auto fl_expected_pos = fl_pos * husarion_ugv_hardware_interfaces_test::kRbtqPosFbToRad; + const auto fl_expected_vel = fl_vel * + husarion_ugv_hardware_interfaces_test::kRbtqVelFbToRadPerSec; const auto fl_expected_eff = fl_eff * - panther_hardware_interfaces_test::kRbtqCurrentFbToNewtonMeters; - const auto fr_expected_pos = fr_pos * panther_hardware_interfaces_test::kRbtqPosFbToRad; - const auto fr_expected_vel = fr_vel * panther_hardware_interfaces_test::kRbtqVelFbToRadPerSec; + husarion_ugv_hardware_interfaces_test::kRbtqCurrentFbToNewtonMeters; + const auto fr_expected_pos = fr_pos * husarion_ugv_hardware_interfaces_test::kRbtqPosFbToRad; + const auto fr_expected_vel = fr_vel * + husarion_ugv_hardware_interfaces_test::kRbtqVelFbToRadPerSec; const auto fr_expected_eff = fr_eff * - panther_hardware_interfaces_test::kRbtqCurrentFbToNewtonMeters; - const auto rl_expected_pos = rl_pos * panther_hardware_interfaces_test::kRbtqPosFbToRad; - const auto rl_expected_vel = rl_vel * panther_hardware_interfaces_test::kRbtqVelFbToRadPerSec; + husarion_ugv_hardware_interfaces_test::kRbtqCurrentFbToNewtonMeters; + const auto rl_expected_pos = rl_pos * husarion_ugv_hardware_interfaces_test::kRbtqPosFbToRad; + const auto rl_expected_vel = rl_vel * + husarion_ugv_hardware_interfaces_test::kRbtqVelFbToRadPerSec; const auto rl_expected_eff = rl_eff * - panther_hardware_interfaces_test::kRbtqCurrentFbToNewtonMeters; - const auto rr_expected_pos = rr_pos * panther_hardware_interfaces_test::kRbtqPosFbToRad; - const auto rr_expected_vel = rr_vel * panther_hardware_interfaces_test::kRbtqVelFbToRadPerSec; + husarion_ugv_hardware_interfaces_test::kRbtqCurrentFbToNewtonMeters; + const auto rr_expected_pos = rr_pos * husarion_ugv_hardware_interfaces_test::kRbtqPosFbToRad; + const auto rr_expected_vel = rr_vel * + husarion_ugv_hardware_interfaces_test::kRbtqVelFbToRadPerSec; const auto rr_expected_eff = rr_eff * - panther_hardware_interfaces_test::kRbtqCurrentFbToNewtonMeters; + husarion_ugv_hardware_interfaces_test::kRbtqCurrentFbToNewtonMeters; - panther_hardware_interfaces::MotorDriverState fl_motor_driver_state = { + husarion_ugv_hardware_interfaces::MotorDriverState fl_motor_driver_state = { fl_pos, fl_vel, fl_eff, {0, 0}, {0, 0}}; - panther_hardware_interfaces::MotorDriverState fr_motor_driver_state = { + husarion_ugv_hardware_interfaces::MotorDriverState fr_motor_driver_state = { fr_pos, fr_vel, fr_eff, {0, 0}, {0, 0}}; - panther_hardware_interfaces::MotorDriverState rl_motor_driver_state = { + husarion_ugv_hardware_interfaces::MotorDriverState rl_motor_driver_state = { rl_pos, rl_vel, rl_eff, {0, 0}, {0, 0}}; - panther_hardware_interfaces::MotorDriverState rr_motor_driver_state = { + husarion_ugv_hardware_interfaces::MotorDriverState rr_motor_driver_state = { rr_pos, rr_vel, rr_eff, {0, 0}, {0, 0}}; - panther_hardware_interfaces::DriverData front_roboteq_data( - panther_hardware_interfaces_test::kDrivetrainSettings); - panther_hardware_interfaces::DriverData rear_roboteq_data( - panther_hardware_interfaces_test::kDrivetrainSettings); + husarion_ugv_hardware_interfaces::DriverData front_roboteq_data( + husarion_ugv_hardware_interfaces_test::kDrivetrainSettings); + husarion_ugv_hardware_interfaces::DriverData rear_roboteq_data( + husarion_ugv_hardware_interfaces_test::kDrivetrainSettings); // left - channel 2, right - channel 1 front_roboteq_data.SetMotorsStates(fr_motor_driver_state, fl_motor_driver_state, false); rear_roboteq_data.SetMotorsStates(rr_motor_driver_state, rl_motor_driver_state, false); EXPECT_CALL( *panther_system_->mock_robot_driver, - GetData(::testing::Eq(panther_hardware_interfaces::DriverNames::FRONT))) + GetData(::testing::Eq(husarion_ugv_hardware_interfaces::DriverNames::FRONT))) .WillOnce(::testing::ReturnRef(front_roboteq_data)); EXPECT_CALL( *panther_system_->mock_robot_driver, - GetData(::testing::Eq(panther_hardware_interfaces::DriverNames::REAR))) + GetData(::testing::Eq(husarion_ugv_hardware_interfaces::DriverNames::REAR))) .WillOnce(::testing::ReturnRef(rear_roboteq_data)); ASSERT_NO_THROW(panther_system_->UpdateHwStates()); @@ -199,26 +212,26 @@ TEST_F(TestPantherSystem, UpdateHwStates) TEST_F(TestPantherSystem, UpdateMotorsStateDataTimedOut) { - panther_hardware_interfaces::MotorDriverState motor_driver_state; + husarion_ugv_hardware_interfaces::MotorDriverState motor_driver_state; - panther_hardware_interfaces::DriverData roboteq_data( - panther_hardware_interfaces_test::kDrivetrainSettings); + husarion_ugv_hardware_interfaces::DriverData roboteq_data( + husarion_ugv_hardware_interfaces_test::kDrivetrainSettings); roboteq_data.SetMotorsStates(motor_driver_state, motor_driver_state, true); EXPECT_CALL( *panther_system_->mock_robot_driver, - GetData(::testing::Eq(panther_hardware_interfaces::DriverNames::FRONT))) + GetData(::testing::Eq(husarion_ugv_hardware_interfaces::DriverNames::FRONT))) .WillOnce(::testing::ReturnRef(roboteq_data)); EXPECT_CALL( *panther_system_->mock_robot_driver, - GetData(::testing::Eq(panther_hardware_interfaces::DriverNames::REAR))) + GetData(::testing::Eq(husarion_ugv_hardware_interfaces::DriverNames::REAR))) .Times(0); panther_system_->UpdateMotorsStateDataTimedOut(); auto error_map = panther_system_->GetRoboteqErrorFilter()->GetErrorMap(); - auto error = error_map.at(panther_hardware_interfaces::error_filter_id_names.at( - panther_hardware_interfaces::ErrorsFilterIds::READ_PDO_MOTOR_STATES)); + auto error = error_map.at(husarion_ugv_hardware_interfaces::error_filter_id_names.at( + husarion_ugv_hardware_interfaces::ErrorsFilterIds::READ_PDO_MOTOR_STATES)); EXPECT_TRUE(error); @@ -227,19 +240,19 @@ TEST_F(TestPantherSystem, UpdateMotorsStateDataTimedOut) EXPECT_CALL( *panther_system_->mock_robot_driver, - GetData(::testing::Eq(panther_hardware_interfaces::DriverNames::FRONT))) + GetData(::testing::Eq(husarion_ugv_hardware_interfaces::DriverNames::FRONT))) .Times(1); EXPECT_CALL( *panther_system_->mock_robot_driver, - GetData(::testing::Eq(panther_hardware_interfaces::DriverNames::REAR))) + GetData(::testing::Eq(husarion_ugv_hardware_interfaces::DriverNames::REAR))) .Times(1); panther_system_->GetRoboteqErrorFilter()->SetClearErrorsFlag(); panther_system_->UpdateMotorsStateDataTimedOut(); error_map = panther_system_->GetRoboteqErrorFilter()->GetErrorMap(); - error = error_map.at(panther_hardware_interfaces::error_filter_id_names.at( - panther_hardware_interfaces::ErrorsFilterIds::READ_PDO_MOTOR_STATES)); + error = error_map.at(husarion_ugv_hardware_interfaces::error_filter_id_names.at( + husarion_ugv_hardware_interfaces::ErrorsFilterIds::READ_PDO_MOTOR_STATES)); EXPECT_FALSE(error); } @@ -252,30 +265,30 @@ TEST_F(TestPantherSystem, UpdateDriverStateMsg) TEST_F(TestPantherSystem, UpdateFlagErrors) { - panther_hardware_interfaces::DriverState driver_state; + husarion_ugv_hardware_interfaces::DriverState driver_state; driver_state.fault_flags = 0b01; driver_state.script_flags = 0; driver_state.runtime_stat_flag_channel_1 = 0; driver_state.runtime_stat_flag_channel_2 = 0; - panther_hardware_interfaces::DriverData roboteq_data( - panther_hardware_interfaces_test::kDrivetrainSettings); + husarion_ugv_hardware_interfaces::DriverData roboteq_data( + husarion_ugv_hardware_interfaces_test::kDrivetrainSettings); roboteq_data.SetDriverState(driver_state, false); EXPECT_CALL( *panther_system_->mock_robot_driver, - GetData(::testing::Eq(panther_hardware_interfaces::DriverNames::FRONT))) + GetData(::testing::Eq(husarion_ugv_hardware_interfaces::DriverNames::FRONT))) .Times(1); EXPECT_CALL( *panther_system_->mock_robot_driver, - GetData(::testing::Eq(panther_hardware_interfaces::DriverNames::REAR))) + GetData(::testing::Eq(husarion_ugv_hardware_interfaces::DriverNames::REAR))) .WillOnce(::testing::ReturnRef(roboteq_data)); panther_system_->UpdateFlagErrors(); auto error_map = panther_system_->GetRoboteqErrorFilter()->GetErrorMap(); - auto error = error_map.at(panther_hardware_interfaces::error_filter_id_names.at( - panther_hardware_interfaces::ErrorsFilterIds::ROBOTEQ_DRIVER)); + auto error = error_map.at(husarion_ugv_hardware_interfaces::error_filter_id_names.at( + husarion_ugv_hardware_interfaces::ErrorsFilterIds::ROBOTEQ_DRIVER)); EXPECT_TRUE(error); @@ -285,45 +298,45 @@ TEST_F(TestPantherSystem, UpdateFlagErrors) EXPECT_CALL( *panther_system_->mock_robot_driver, - GetData(::testing::Eq(panther_hardware_interfaces::DriverNames::FRONT))) + GetData(::testing::Eq(husarion_ugv_hardware_interfaces::DriverNames::FRONT))) .Times(1); EXPECT_CALL( *panther_system_->mock_robot_driver, - GetData(::testing::Eq(panther_hardware_interfaces::DriverNames::REAR))) + GetData(::testing::Eq(husarion_ugv_hardware_interfaces::DriverNames::REAR))) .WillOnce(::testing::ReturnRef(roboteq_data)); panther_system_->GetRoboteqErrorFilter()->SetClearErrorsFlag(); panther_system_->UpdateFlagErrors(); error_map = panther_system_->GetRoboteqErrorFilter()->GetErrorMap(); - error = error_map.at(panther_hardware_interfaces::error_filter_id_names.at( - panther_hardware_interfaces::ErrorsFilterIds::ROBOTEQ_DRIVER)); + error = error_map.at(husarion_ugv_hardware_interfaces::error_filter_id_names.at( + husarion_ugv_hardware_interfaces::ErrorsFilterIds::ROBOTEQ_DRIVER)); EXPECT_FALSE(error); } TEST_F(TestPantherSystem, UpdateDriverStateDataTimedOut) { - panther_hardware_interfaces::DriverState driver_state; + husarion_ugv_hardware_interfaces::DriverState driver_state; - panther_hardware_interfaces::DriverData roboteq_data( - panther_hardware_interfaces_test::kDrivetrainSettings); + husarion_ugv_hardware_interfaces::DriverData roboteq_data( + husarion_ugv_hardware_interfaces_test::kDrivetrainSettings); roboteq_data.SetDriverState(driver_state, true); EXPECT_CALL( *panther_system_->mock_robot_driver, - GetData(::testing::Eq(panther_hardware_interfaces::DriverNames::FRONT))) + GetData(::testing::Eq(husarion_ugv_hardware_interfaces::DriverNames::FRONT))) .WillOnce(::testing::ReturnRef(roboteq_data)); EXPECT_CALL( *panther_system_->mock_robot_driver, - GetData(::testing::Eq(panther_hardware_interfaces::DriverNames::REAR))) + GetData(::testing::Eq(husarion_ugv_hardware_interfaces::DriverNames::REAR))) .Times(0); panther_system_->UpdateDriverStateDataTimedOut(); auto error_map = panther_system_->GetRoboteqErrorFilter()->GetErrorMap(); - auto error = error_map.at(panther_hardware_interfaces::error_filter_id_names.at( - panther_hardware_interfaces::ErrorsFilterIds::READ_PDO_DRIVER_STATE)); + auto error = error_map.at(husarion_ugv_hardware_interfaces::error_filter_id_names.at( + husarion_ugv_hardware_interfaces::ErrorsFilterIds::READ_PDO_DRIVER_STATE)); EXPECT_TRUE(error); @@ -332,19 +345,19 @@ TEST_F(TestPantherSystem, UpdateDriverStateDataTimedOut) EXPECT_CALL( *panther_system_->mock_robot_driver, - GetData(::testing::Eq(panther_hardware_interfaces::DriverNames::FRONT))) + GetData(::testing::Eq(husarion_ugv_hardware_interfaces::DriverNames::FRONT))) .WillOnce(::testing::ReturnRef(roboteq_data)); EXPECT_CALL( *panther_system_->mock_robot_driver, - GetData(::testing::Eq(panther_hardware_interfaces::DriverNames::REAR))) + GetData(::testing::Eq(husarion_ugv_hardware_interfaces::DriverNames::REAR))) .Times(1); panther_system_->GetRoboteqErrorFilter()->SetClearErrorsFlag(); panther_system_->UpdateDriverStateDataTimedOut(); error_map = panther_system_->GetRoboteqErrorFilter()->GetErrorMap(); - error = error_map.at(panther_hardware_interfaces::error_filter_id_names.at( - panther_hardware_interfaces::ErrorsFilterIds::READ_PDO_DRIVER_STATE)); + error = error_map.at(husarion_ugv_hardware_interfaces::error_filter_id_names.at( + husarion_ugv_hardware_interfaces::ErrorsFilterIds::READ_PDO_DRIVER_STATE)); EXPECT_FALSE(error); } diff --git a/panther_hardware_interfaces/test/unit/panther_system/test_system_ros_interface.cpp b/husarion_ugv_hardware_interfaces/test/unit/panther_system/test_system_ros_interface.cpp similarity index 87% rename from panther_hardware_interfaces/test/unit/panther_system/test_system_ros_interface.cpp rename to husarion_ugv_hardware_interfaces/test/unit/panther_system/test_system_ros_interface.cpp index 68e2fbff6..44cd950e3 100644 --- a/panther_hardware_interfaces/test/unit/panther_system/test_system_ros_interface.cpp +++ b/husarion_ugv_hardware_interfaces/test/unit/panther_system/test_system_ros_interface.cpp @@ -22,13 +22,13 @@ #include -#include +#include #include "utils/test_constants.hpp" using RobotDriverStateMsg = panther_msgs::msg::RobotDriverState; -class SystemROSInterfaceWrapper : public panther_hardware_interfaces::SystemROSInterface +class SystemROSInterfaceWrapper : public husarion_ugv_hardware_interfaces::SystemROSInterface { public: SystemROSInterfaceWrapper(const std::string & node_name) : SystemROSInterface(node_name) {} @@ -52,7 +52,7 @@ class TestSystemROSInterface : public ::testing::Test TEST(TestSystemROSInterfaceInitialization, NodeCreation) { - using panther_hardware_interfaces::SystemROSInterface; + using husarion_ugv_hardware_interfaces::SystemROSInterface; std::vector node_names; const std::string system_node_name = "hardware_controller"; @@ -82,10 +82,10 @@ TEST(TestSystemROSInterfaceInitialization, NodeCreation) TEST_F(TestSystemROSInterface, UpdateMsgErrorFlags) { - panther_hardware_interfaces::DriverData data( - panther_hardware_interfaces_test::kDrivetrainSettings); + husarion_ugv_hardware_interfaces::DriverData data( + husarion_ugv_hardware_interfaces_test::kDrivetrainSettings); - panther_hardware_interfaces::DriverState driver_state; + husarion_ugv_hardware_interfaces::DriverState driver_state; driver_state.fault_flags = 0b00000001; driver_state.script_flags = 0b00000010; driver_state.runtime_stat_flag_channel_1 = 0b00001000; @@ -106,7 +106,7 @@ TEST_F(TestSystemROSInterface, UpdateMsgErrorFlags) TEST_F(TestSystemROSInterface, UpdateMsgDriversStates) { - panther_hardware_interfaces::RoboteqDriverState state; + husarion_ugv_hardware_interfaces::RoboteqDriverState state; const std::int16_t temp = 36; const std::int16_t heatsink_temp = 37; @@ -138,14 +138,14 @@ TEST_F(TestSystemROSInterface, UpdateMsgDriversStates) TEST_F(TestSystemROSInterface, UpdateMsgErrors) { - panther_hardware_interfaces::CANErrors can_errors; + husarion_ugv_hardware_interfaces::CANErrors can_errors; can_errors.error = true; can_errors.write_pdo_cmds_error = true; can_errors.read_pdo_motor_states_error = false; can_errors.read_pdo_driver_state_error = false; - panther_hardware_interfaces::DriverCANErrors driver_can_errors; + husarion_ugv_hardware_interfaces::DriverCANErrors driver_can_errors; driver_can_errors.motor_states_data_timed_out = true; driver_can_errors.driver_state_data_timed_out = false; driver_can_errors.can_error = false; @@ -181,12 +181,13 @@ TEST_F(TestSystemROSInterface, CreateDriverStateEntryInMsg) // check 3 different methods that can create a new entry in the message system_ros_interface_->UpdateMsgErrorFlags( - driver_1_name, - panther_hardware_interfaces::DriverData(panther_hardware_interfaces_test::kDrivetrainSettings)); + driver_1_name, husarion_ugv_hardware_interfaces::DriverData( + husarion_ugv_hardware_interfaces_test::kDrivetrainSettings)); system_ros_interface_->UpdateMsgDriversStates(driver_2_name, {}); - panther_hardware_interfaces::CANErrors can_errors; - can_errors.driver_errors.emplace(driver_3_name, panther_hardware_interfaces::DriverCANErrors()); + husarion_ugv_hardware_interfaces::CANErrors can_errors; + can_errors.driver_errors.emplace( + driver_3_name, husarion_ugv_hardware_interfaces::DriverCANErrors()); system_ros_interface_->UpdateMsgErrors(can_errors); EXPECT_EQ(driver_state_msg.driver_states.size(), 3); diff --git a/panther_hardware_interfaces/test/unit/panther_system/test_ugv_system.cpp b/husarion_ugv_hardware_interfaces/test/unit/panther_system/test_ugv_system.cpp similarity index 90% rename from panther_hardware_interfaces/test/unit/panther_system/test_ugv_system.cpp rename to husarion_ugv_hardware_interfaces/test/unit/panther_system/test_ugv_system.cpp index 0474f8cd3..cbcb6f36d 100644 --- a/panther_hardware_interfaces/test/unit/panther_system/test_ugv_system.cpp +++ b/husarion_ugv_hardware_interfaces/test/unit/panther_system/test_ugv_system.cpp @@ -23,21 +23,21 @@ #include #include -#include "panther_hardware_interfaces/panther_system/ugv_system.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/ugv_system.hpp" #include "utils/system_test_utils.hpp" -class MockUGVSystem : public panther_hardware_interfaces::UGVSystem +class MockUGVSystem : public husarion_ugv_hardware_interfaces::UGVSystem { public: MockUGVSystem(const std::vector & joint_order) - : panther_hardware_interfaces::UGVSystem(joint_order) + : husarion_ugv_hardware_interfaces::UGVSystem(joint_order) { mock_robot_driver_ = - std::make_shared(); + std::make_shared(); mock_gpio_controller_ = - std::make_shared(); - mock_e_stop_ = std::make_shared(); + std::make_shared(); + mock_e_stop_ = std::make_shared(); ON_CALL(*this, DefineRobotDriver()).WillByDefault(::testing::Invoke([&]() { robot_driver_ = mock_robot_driver_; @@ -69,7 +69,8 @@ class MockUGVSystem : public panther_hardware_interfaces::UGVSystem void DefaultDefineRobotDriver() { - robot_driver_ = std::make_shared(); + robot_driver_ = + std::make_shared(); } void SetHwCommandVelocity(const std::vector & velocity) @@ -83,18 +84,19 @@ class MockUGVSystem : public panther_hardware_interfaces::UGVSystem } void SetHwStateEffort(const std::vector & effort) { hw_states_efforts_ = effort; } - std::shared_ptr GetMockRobotDriver() + std::shared_ptr + GetMockRobotDriver() { return mock_robot_driver_; } - std::shared_ptr + std::shared_ptr GetMockGPIOController() { return mock_gpio_controller_; } - std::shared_ptr GetMockEStop() + std::shared_ptr GetMockEStop() { return mock_e_stop_; } @@ -102,10 +104,11 @@ class MockUGVSystem : public panther_hardware_interfaces::UGVSystem using NiceMock = testing::NiceMock; private: - std::shared_ptr mock_robot_driver_; - std::shared_ptr + std::shared_ptr + mock_robot_driver_; + std::shared_ptr mock_gpio_controller_; - std::shared_ptr mock_e_stop_; + std::shared_ptr mock_e_stop_; }; class TestUGVSystem : public ::testing::Test @@ -116,7 +119,7 @@ class TestUGVSystem : public ::testing::Test ugv_system_ = std::make_shared(std::vector{"fl", "fr", "rl", "rr"}); - hardware_info_ = panther_hardware_interfaces_test::GenerateDefaultHardwareInfo(); + hardware_info_ = husarion_ugv_hardware_interfaces_test::GenerateDefaultHardwareInfo(); } ~TestUGVSystem() {} diff --git a/panther_hardware_interfaces/test/utils/fake_can_socket.hpp b/husarion_ugv_hardware_interfaces/test/utils/fake_can_socket.hpp similarity index 86% rename from panther_hardware_interfaces/test/utils/fake_can_socket.hpp rename to husarion_ugv_hardware_interfaces/test/utils/fake_can_socket.hpp index e2920cff8..0cb07b864 100644 --- a/panther_hardware_interfaces/test/utils/fake_can_socket.hpp +++ b/husarion_ugv_hardware_interfaces/test/utils/fake_can_socket.hpp @@ -12,15 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_HARDWARE_INTERFACES_TEST_UTILS_FAKE_CAN_SOCKET_HPP_ -#define PANTHER_HARDWARE_INTERFACES_TEST_UTILS_FAKE_CAN_SOCKET_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_TEST_UTILS_FAKE_CAN_SOCKET_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_TEST_UTILS_FAKE_CAN_SOCKET_HPP_ #include #include #include -namespace panther_hardware_interfaces_test +namespace husarion_ugv_hardware_interfaces_test { class FakeCANSocket @@ -75,6 +75,6 @@ class FakeCANSocket bool can_device_created_; }; -} // namespace panther_hardware_interfaces_test +} // namespace husarion_ugv_hardware_interfaces_test -#endif // PANTHER_HARDWARE_INTERFACES_TEST_UTILS_FAKE_CAN_SOCKET_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_TEST_UTILS_FAKE_CAN_SOCKET_HPP_ diff --git a/panther_hardware_interfaces/test/utils/mock_driver.hpp b/husarion_ugv_hardware_interfaces/test/utils/mock_driver.hpp similarity index 63% rename from panther_hardware_interfaces/test/utils/mock_driver.hpp rename to husarion_ugv_hardware_interfaces/test/utils/mock_driver.hpp index da2b33901..d9da785bd 100644 --- a/panther_hardware_interfaces/test/utils/mock_driver.hpp +++ b/husarion_ugv_hardware_interfaces/test/utils/mock_driver.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_HARDWARE_INTERFACES_TEST_UTILS_MOCK_DRIVER_HPP_ -#define PANTHER_HARDWARE_INTERFACES_TEST_UTILS_MOCK_DRIVER_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_TEST_UTILS_MOCK_DRIVER_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_TEST_UTILS_MOCK_DRIVER_HPP_ #include #include @@ -22,12 +22,12 @@ #include -#include "panther_hardware_interfaces/panther_system/robot_driver/driver.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/driver.hpp" -namespace panther_hardware_interfaces_test +namespace husarion_ugv_hardware_interfaces_test { -class MockDriver : public panther_hardware_interfaces::DriverInterface +class MockDriver : public husarion_ugv_hardware_interfaces::DriverInterface { public: MockDriver() @@ -43,12 +43,12 @@ class MockDriver : public panther_hardware_interfaces::DriverInterface MOCK_METHOD(bool, IsCANError, (), (const, override)); MOCK_METHOD(bool, IsHeartbeatTimeout, (), (const, override)); - MOCK_METHOD(panther_hardware_interfaces::DriverState, ReadState, (), (override)); + MOCK_METHOD(husarion_ugv_hardware_interfaces::DriverState, ReadState, (), (override)); MOCK_METHOD(void, ResetScript, (), (override)); MOCK_METHOD(void, TurnOnEStop, (), (override)); MOCK_METHOD(void, TurnOffEStop, (), (override)); - std::shared_ptr GetMotorDriver( + std::shared_ptr GetMotorDriver( const std::string & name) override { return motor_drivers_.at(name); @@ -56,7 +56,7 @@ class MockDriver : public panther_hardware_interfaces::DriverInterface void AddMotorDriver( const std::string name, - std::shared_ptr motor_driver) override + std::shared_ptr motor_driver) override { motor_drivers_.emplace(name, motor_driver); } @@ -64,20 +64,20 @@ class MockDriver : public panther_hardware_interfaces::DriverInterface using NiceMock = testing::NiceMock; private: - std::map> + std::map> motor_drivers_; }; -class MockMotorDriver : public panther_hardware_interfaces::MotorDriverInterface +class MockMotorDriver : public husarion_ugv_hardware_interfaces::MotorDriverInterface { public: - MOCK_METHOD(panther_hardware_interfaces::MotorDriverState, ReadState, (), (override)); + MOCK_METHOD(husarion_ugv_hardware_interfaces::MotorDriverState, ReadState, (), (override)); MOCK_METHOD(void, SendCmdVel, (const std::int32_t cmd), (override)); MOCK_METHOD(void, TurnOnSafetyStop, (), (override)); using NiceMock = testing::NiceMock; }; -} // namespace panther_hardware_interfaces_test +} // namespace husarion_ugv_hardware_interfaces_test -#endif // PANTHER_HARDWARE_INTERFACES_TEST_UTILS_MOCK_DRIVER_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_TEST_UTILS_MOCK_DRIVER_HPP_ diff --git a/panther_hardware_interfaces/test/utils/mock_roboteq.hpp b/husarion_ugv_hardware_interfaces/test/utils/mock_roboteq.hpp similarity index 95% rename from panther_hardware_interfaces/test/utils/mock_roboteq.hpp rename to husarion_ugv_hardware_interfaces/test/utils/mock_roboteq.hpp index c863daf4e..d2ff9f7fd 100644 --- a/panther_hardware_interfaces/test/utils/mock_roboteq.hpp +++ b/husarion_ugv_hardware_interfaces/test/utils/mock_roboteq.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_HARDWARE_INTERFACES_TEST_UTILS_MOCK_ROBOTEQ_HPP_ -#define PANTHER_HARDWARE_INTERFACES_TEST_UTILS_MOCK_ROBOTEQ_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_TEST_UTILS_MOCK_ROBOTEQ_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_TEST_UTILS_MOCK_ROBOTEQ_HPP_ #include #include @@ -31,7 +31,7 @@ #include "lely/io2/sys/sigset.hpp" #include "lely/io2/sys/timer.hpp" -namespace panther_hardware_interfaces_test +namespace husarion_ugv_hardware_interfaces_test { enum class DriverFaultFlags { @@ -284,11 +284,11 @@ class MockRoboteq std::thread([this, motors_states_period, driver_state_period]() { std::string slave_eds_path = std::filesystem::path( - ament_index_cpp::get_package_share_directory("panther_hardware_interfaces")) / + ament_index_cpp::get_package_share_directory("husarion_ugv_hardware_interfaces")) / "config" / "roboteq_motor_controllers_v80_21a.eds"; std::string slave1_eds_bin_path = std::filesystem::path( - ament_index_cpp::get_package_share_directory("panther_hardware_interfaces")) / + ament_index_cpp::get_package_share_directory("husarion_ugv_hardware_interfaces")) / "test" / "config" / "slave_1.bin"; lely::io::IoGuard io_guard; @@ -359,6 +359,6 @@ class MockRoboteq std::shared_ptr driver_; }; -} // namespace panther_hardware_interfaces_test +} // namespace husarion_ugv_hardware_interfaces_test -#endif // PANTHER_HARDWARE_INTERFACES_TEST_UTILS_MOCK_ROBOTEQ_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_TEST_UTILS_MOCK_ROBOTEQ_HPP_ diff --git a/panther_hardware_interfaces/test/utils/panther_system_test_utils.hpp b/husarion_ugv_hardware_interfaces/test/utils/panther_system_test_utils.hpp similarity index 92% rename from panther_hardware_interfaces/test/utils/panther_system_test_utils.hpp rename to husarion_ugv_hardware_interfaces/test/utils/panther_system_test_utils.hpp index 0e07cc376..39cf60d76 100644 --- a/panther_hardware_interfaces/test/utils/panther_system_test_utils.hpp +++ b/husarion_ugv_hardware_interfaces/test/utils/panther_system_test_utils.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_HARDWARE_INTERFACES_TEST_UTILS_PANTHER_SYSTEM_TEST_UTILS_HPP_ -#define PANTHER_HARDWARE_INTERFACES_TEST_UTILS_PANTHER_SYSTEM_TEST_UTILS_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_TEST_UTILS_PANTHER_SYSTEM_TEST_UTILS_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_TEST_UTILS_PANTHER_SYSTEM_TEST_UTILS_HPP_ #include #include @@ -28,7 +28,7 @@ #include "roboteqs_mock.hpp" #include "test_constants.hpp" -namespace panther_hardware_interfaces_test +namespace husarion_ugv_hardware_interfaces_test { /** @@ -159,6 +159,6 @@ class PantherSystemTestUtils std::string default_panther_system_urdf_; }; -} // namespace panther_hardware_interfaces_test +} // namespace husarion_ugv_hardware_interfaces_test -#endif // PANTHER_HARDWARE_INTERFACES_TEST_UTILS_PANTHER_SYSTEM_TEST_UTILS_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_TEST_UTILS_PANTHER_SYSTEM_TEST_UTILS_HPP_ diff --git a/panther_hardware_interfaces/test/utils/system_test_utils.hpp b/husarion_ugv_hardware_interfaces/test/utils/system_test_utils.hpp similarity index 75% rename from panther_hardware_interfaces/test/utils/system_test_utils.hpp rename to husarion_ugv_hardware_interfaces/test/utils/system_test_utils.hpp index db294b4ed..360359b4e 100644 --- a/panther_hardware_interfaces/test/utils/system_test_utils.hpp +++ b/husarion_ugv_hardware_interfaces/test/utils/system_test_utils.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_HARDWARE_INTERFACES_TEST_SYSTEM_TEST_UTILS_HPP_ -#define PANTHER_HARDWARE_INTERFACES_TEST_SYSTEM_TEST_UTILS_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_TEST_SYSTEM_TEST_UTILS_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_TEST_SYSTEM_TEST_UTILS_HPP_ #include #include @@ -22,16 +22,16 @@ #include -#include "panther_hardware_interfaces/panther_system/gpio/gpio_controller.hpp" -#include "panther_hardware_interfaces/panther_system/robot_driver/robot_driver.hpp" -#include "panther_hardware_interfaces/panther_system/system_e_stop.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/gpio/gpio_controller.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/panther_system/system_e_stop.hpp" #include "utils/mock_driver.hpp" -namespace panther_hardware_interfaces_test +namespace husarion_ugv_hardware_interfaces_test { -class MockRobotDriver : public panther_hardware_interfaces::RobotDriverInterface +class MockRobotDriver : public husarion_ugv_hardware_interfaces::RobotDriverInterface { public: MOCK_METHOD(void, Initialize, (), (override)); @@ -41,7 +41,8 @@ class MockRobotDriver : public panther_hardware_interfaces::RobotDriverInterface MOCK_METHOD(void, UpdateMotorsState, (), (override)); MOCK_METHOD(void, UpdateDriversState, (), (override)); MOCK_METHOD( - const panther_hardware_interfaces::DriverData &, GetData, (const std::string &), (override)); + const husarion_ugv_hardware_interfaces::DriverData &, GetData, (const std::string &), + (override)); MOCK_METHOD(void, SendSpeedCommands, (const std::vector &), (override)); MOCK_METHOD(void, TurnOnEStop, (), (override)); MOCK_METHOD(void, TurnOffEStop, (), (override)); @@ -51,26 +52,26 @@ class MockRobotDriver : public panther_hardware_interfaces::RobotDriverInterface using NiceMock = testing::NiceMock; }; -class MockGPIODriver : public panther_hardware_interfaces::GPIODriverInterface +class MockGPIODriver : public husarion_ugv_hardware_interfaces::GPIODriverInterface { public: MOCK_METHOD(void, GPIOMonitorEnable, (const bool, const unsigned), (override)); MOCK_METHOD( void, ConfigureEdgeEventCallback, - (const std::function &), (override)); + (const std::function &), (override)); MOCK_METHOD( void, ChangePinDirection, - (const panther_hardware_interfaces::GPIOPin, const gpiod::line::direction), (override)); + (const husarion_ugv_hardware_interfaces::GPIOPin, const gpiod::line::direction), (override)); MOCK_METHOD( - bool, IsPinAvailable, (const panther_hardware_interfaces::GPIOPin), (const, override)); - MOCK_METHOD(bool, IsPinActive, (const panther_hardware_interfaces::GPIOPin), (override)); + bool, IsPinAvailable, (const husarion_ugv_hardware_interfaces::GPIOPin), (const, override)); + MOCK_METHOD(bool, IsPinActive, (const husarion_ugv_hardware_interfaces::GPIOPin), (override)); MOCK_METHOD( - bool, SetPinValue, (const panther_hardware_interfaces::GPIOPin, const bool), (override)); + bool, SetPinValue, (const husarion_ugv_hardware_interfaces::GPIOPin, const bool), (override)); using NiceMock = testing::NiceMock; }; -class MockGPIOController : public panther_hardware_interfaces::GPIOControllerInterface +class MockGPIOController : public husarion_ugv_hardware_interfaces::GPIOControllerInterface { public: MockGPIOController() : GPIOControllerInterface() @@ -88,13 +89,13 @@ class MockGPIOController : public panther_hardware_interfaces::GPIOControllerInt MOCK_METHOD(bool, ChargerEnable, (const bool), (override)); MOCK_METHOD(bool, LEDControlEnable, (const bool), (override)); MOCK_METHOD( - (std::unordered_map), QueryControlInterfaceIOStates, - (), (const, override)); + (std::unordered_map), + QueryControlInterfaceIOStates, (), (const, override)); using NiceMock = testing::NiceMock; }; -class MockEStop : public panther_hardware_interfaces::EStopInterface +class MockEStop : public husarion_ugv_hardware_interfaces::EStopInterface { public: MockEStop() : EStopInterface() {} @@ -169,6 +170,6 @@ hardware_interface::HardwareInfo GenerateDefaultHardwareInfo() return hardware_info; } -} // namespace panther_hardware_interfaces_test +} // namespace husarion_ugv_hardware_interfaces_test -#endif // PANTHER_HARDWARE_INTERFACES_TEST_SYSTEM_TEST_UTILS_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_TEST_SYSTEM_TEST_UTILS_HPP_ diff --git a/panther_hardware_interfaces/test/utils/test_constants.hpp b/husarion_ugv_hardware_interfaces/test/utils/test_constants.hpp similarity index 78% rename from panther_hardware_interfaces/test/utils/test_constants.hpp rename to husarion_ugv_hardware_interfaces/test/utils/test_constants.hpp index c3d4a0fa2..a25e75f60 100644 --- a/panther_hardware_interfaces/test/utils/test_constants.hpp +++ b/husarion_ugv_hardware_interfaces/test/utils/test_constants.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_HARDWARE_INTERFACES_TEST_UTILS_TEST_CONSTANTS_HPP_ -#define PANTHER_HARDWARE_INTERFACES_TEST_UTILS_TEST_CONSTANTS_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_TEST_UTILS_TEST_CONSTANTS_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_TEST_UTILS_TEST_CONSTANTS_HPP_ #include #include @@ -21,13 +21,13 @@ #include #include -#include -#include +#include +#include -namespace panther_hardware_interfaces_test +namespace husarion_ugv_hardware_interfaces_test { -const panther_hardware_interfaces::CANopenSettings kCANopenSettings{ +const husarion_ugv_hardware_interfaces::CANopenSettings kCANopenSettings{ "panther_can", 3, {{"default", 1}, {"front", 1}, {"rear", 2}}, @@ -36,7 +36,7 @@ const panther_hardware_interfaces::CANopenSettings kCANopenSettings{ std::chrono::milliseconds(100), }; -const panther_hardware_interfaces::DrivetrainSettings kDrivetrainSettings{ +const husarion_ugv_hardware_interfaces::DrivetrainSettings kDrivetrainSettings{ 0.11, 30.08, 0.75, 1600.0, 3600.0}; constexpr float kRadPerSecToRbtqCmd = 30.08 * (1.0 / (2.0 * M_PI)) * 60.0 * (1000.0 / 3600.0); @@ -63,7 +63,7 @@ const std::string kJointInterfaces = )"; const std::string kPluginName = - R"(panther_hardware_interfaces/PantherSystem + R"(husarion_ugv_hardware_interfaces/PantherSystem )"; const std::map kDefaultParamMap = { @@ -92,6 +92,6 @@ const std::vector kDefaultJoints = { const std::string kRobotDriverStateTopic = "/hardware_controller/robot_driver_state"; -} // namespace panther_hardware_interfaces_test +} // namespace husarion_ugv_hardware_interfaces_test -#endif // PANTHER_HARDWARE_INTERFACES_TEST_UTILS_TEST_CONSTANTS_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_TEST_UTILS_TEST_CONSTANTS_HPP_ diff --git a/panther_lights/.docs/AUTONOMOUS_ACTION.webp b/husarion_ugv_lights/.docs/AUTONOMOUS_ACTION.webp similarity index 100% rename from panther_lights/.docs/AUTONOMOUS_ACTION.webp rename to husarion_ugv_lights/.docs/AUTONOMOUS_ACTION.webp diff --git a/panther_lights/.docs/BATTERY_STATE.webp b/husarion_ugv_lights/.docs/BATTERY_STATE.webp similarity index 100% rename from panther_lights/.docs/BATTERY_STATE.webp rename to husarion_ugv_lights/.docs/BATTERY_STATE.webp diff --git a/panther_lights/.docs/CHARGING_BATTERY.webp b/husarion_ugv_lights/.docs/CHARGING_BATTERY.webp similarity index 100% rename from panther_lights/.docs/CHARGING_BATTERY.webp rename to husarion_ugv_lights/.docs/CHARGING_BATTERY.webp diff --git a/panther_lights/.docs/CRITICAL_BATTERY.webp b/husarion_ugv_lights/.docs/CRITICAL_BATTERY.webp similarity index 100% rename from panther_lights/.docs/CRITICAL_BATTERY.webp rename to husarion_ugv_lights/.docs/CRITICAL_BATTERY.webp diff --git a/panther_lights/.docs/ERROR.webp b/husarion_ugv_lights/.docs/ERROR.webp similarity index 100% rename from panther_lights/.docs/ERROR.webp rename to husarion_ugv_lights/.docs/ERROR.webp diff --git a/panther_lights/.docs/E_STOP.webp b/husarion_ugv_lights/.docs/E_STOP.webp similarity index 100% rename from panther_lights/.docs/E_STOP.webp rename to husarion_ugv_lights/.docs/E_STOP.webp diff --git a/panther_lights/.docs/GOAL_ACHIEVED.webp b/husarion_ugv_lights/.docs/GOAL_ACHIEVED.webp similarity index 100% rename from panther_lights/.docs/GOAL_ACHIEVED.webp rename to husarion_ugv_lights/.docs/GOAL_ACHIEVED.webp diff --git a/panther_lights/.docs/LOW_BATTERY.webp b/husarion_ugv_lights/.docs/LOW_BATTERY.webp similarity index 100% rename from panther_lights/.docs/LOW_BATTERY.webp rename to husarion_ugv_lights/.docs/LOW_BATTERY.webp diff --git a/panther_lights/.docs/MANUAL_ACTION.webp b/husarion_ugv_lights/.docs/MANUAL_ACTION.webp similarity index 100% rename from panther_lights/.docs/MANUAL_ACTION.webp rename to husarion_ugv_lights/.docs/MANUAL_ACTION.webp diff --git a/panther_lights/.docs/READY.webp b/husarion_ugv_lights/.docs/READY.webp similarity index 100% rename from panther_lights/.docs/READY.webp rename to husarion_ugv_lights/.docs/READY.webp diff --git a/panther_lights/CHANGELOG.rst b/husarion_ugv_lights/CHANGELOG.rst similarity index 100% rename from panther_lights/CHANGELOG.rst rename to husarion_ugv_lights/CHANGELOG.rst diff --git a/panther_lights/CMakeLists.txt b/husarion_ugv_lights/CMakeLists.txt similarity index 86% rename from panther_lights/CMakeLists.txt rename to husarion_ugv_lights/CMakeLists.txt index 482023e35..3fc9de635 100644 --- a/panther_lights/CMakeLists.txt +++ b/husarion_ugv_lights/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.10.2) -project(panther_lights) +project(husarion_ugv_lights) if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options(-Wall -Wextra -Wpedantic) @@ -10,7 +10,7 @@ set(PACKAGE_DEPENDENCIES diagnostic_updater image_transport panther_msgs - panther_utils + husarion_ugv_utils pluginlib rclcpp rclcpp_components @@ -26,11 +26,10 @@ include_directories(include) pluginlib_export_plugin_description_file(${PROJECT_NAME} plugins.xml) -add_library( - panther_animation_plugins SHARED src/animation/image_animation.cpp - src/animation/charging_animation.cpp) -ament_target_dependencies(panther_animation_plugins panther_utils pluginlib) -target_link_libraries(panther_animation_plugins png yaml-cpp) +add_library(animation_plugins SHARED src/animation/image_animation.cpp + src/animation/charging_animation.cpp) +ament_target_dependencies(animation_plugins husarion_ugv_utils pluginlib) +target_link_libraries(animation_plugins png yaml-cpp) add_library(lights_driver_node_component SHARED src/lights_driver_node.cpp src/apa102.cpp) @@ -52,7 +51,7 @@ add_library( ament_target_dependencies( lights_controller_node_component panther_msgs - panther_utils + husarion_ugv_utils pluginlib rclcpp rclcpp_components @@ -60,12 +59,12 @@ ament_target_dependencies( target_link_libraries(lights_controller_node_component yaml-cpp) rclcpp_components_register_node( - lights_driver_node_component PLUGIN "panther_lights::LightsDriverNode" + lights_driver_node_component PLUGIN "husarion_ugv_lights::LightsDriverNode" EXECUTABLE lights_driver_node) rclcpp_components_register_node( lights_controller_node_component PLUGIN - "panther_lights::LightsControllerNode" EXECUTABLE lights_controller_node) + "husarion_ugv_lights::LightsControllerNode" EXECUTABLE lights_controller_node) ament_export_targets(export_lights_driver_node_component) install( @@ -83,7 +82,7 @@ install( LIBRARY DESTINATION lib RUNTIME DESTINATION bin) -install(TARGETS panther_animation_plugins LIBRARY DESTINATION lib) +install(TARGETS animation_plugins LIBRARY DESTINATION lib) install(DIRECTORY animations config launch test DESTINATION share/${PROJECT_NAME}) @@ -100,7 +99,7 @@ if(BUILD_TESTING) ${PROJECT_NAME}_test_animation PUBLIC $ $) - ament_target_dependencies(${PROJECT_NAME}_test_animation panther_utils) + ament_target_dependencies(${PROJECT_NAME}_test_animation husarion_ugv_utils) target_link_libraries(${PROJECT_NAME}_test_animation yaml-cpp) ament_add_gtest( @@ -112,7 +111,7 @@ if(BUILD_TESTING) PUBLIC $ $) ament_target_dependencies(${PROJECT_NAME}_test_charging_animation - ament_index_cpp panther_utils pluginlib) + ament_index_cpp husarion_ugv_utils pluginlib) target_link_libraries(${PROJECT_NAME}_test_charging_animation yaml-cpp) ament_add_gtest( @@ -124,7 +123,7 @@ if(BUILD_TESTING) PUBLIC $ $) ament_target_dependencies(${PROJECT_NAME}_test_image_animation - ament_index_cpp panther_utils pluginlib) + ament_index_cpp husarion_ugv_utils pluginlib) target_link_libraries(${PROJECT_NAME}_test_image_animation png yaml-cpp) ament_add_gtest( @@ -144,7 +143,7 @@ if(BUILD_TESTING) PUBLIC $ $) ament_target_dependencies(${PROJECT_NAME}_test_led_segment pluginlib - panther_utils) + husarion_ugv_utils) target_link_libraries(${PROJECT_NAME}_test_led_segment yaml-cpp) ament_add_gtest( @@ -158,7 +157,7 @@ if(BUILD_TESTING) PUBLIC $ $) ament_target_dependencies(${PROJECT_NAME}_test_segment_converter pluginlib - panther_utils) + husarion_ugv_utils) target_link_libraries(${PROJECT_NAME}_test_segment_converter yaml-cpp) ament_add_gtest( @@ -172,7 +171,7 @@ if(BUILD_TESTING) PUBLIC $ $) ament_target_dependencies(${PROJECT_NAME}_test_led_animation pluginlib - panther_utils rclcpp) + husarion_ugv_utils rclcpp) target_link_libraries(${PROJECT_NAME}_test_led_animation yaml-cpp) ament_add_gtest( @@ -186,7 +185,7 @@ if(BUILD_TESTING) PUBLIC $ $) ament_target_dependencies(${PROJECT_NAME}_test_led_animations_queue pluginlib - panther_utils rclcpp) + husarion_ugv_utils rclcpp) target_link_libraries(${PROJECT_NAME}_test_led_animations_queue yaml-cpp) ament_add_gmock(${PROJECT_NAME}_test_apa102 test/unit/test_apa102.cpp @@ -205,7 +204,7 @@ if(BUILD_TESTING) PUBLIC $ $) ament_target_dependencies(${PROJECT_NAME}_test_lights_driver_node - panther_utils) + husarion_ugv_utils) target_link_libraries(${PROJECT_NAME}_test_lights_driver_node lights_driver_node_component) @@ -222,19 +221,19 @@ if(BUILD_TESTING) PUBLIC $ $) ament_target_dependencies(${PROJECT_NAME}_test_lights_controller_node - panther_utils) + husarion_ugv_utils) target_link_libraries(${PROJECT_NAME}_test_lights_controller_node lights_controller_node_component yaml-cpp) # Integration tests option(TEST_INTEGRATION "Run integration tests" OFF) if(TEST_INTEGRATION) - add_ros_test(test/integration/panther_lights.test.py) + add_ros_test(test/integration/husarion_ugv_lights.test.py) endif() endif() ament_export_include_directories(include) -ament_export_libraries(panther_animation_plugins) +ament_export_libraries(animation_plugins) ament_package() diff --git a/panther_lights/CONFIGURATION.md b/husarion_ugv_lights/CONFIGURATION.md similarity index 88% rename from panther_lights/CONFIGURATION.md rename to husarion_ugv_lights/CONFIGURATION.md index df53c7dcd..4a80d7757 100644 --- a/panther_lights/CONFIGURATION.md +++ b/husarion_ugv_lights/CONFIGURATION.md @@ -1,4 +1,4 @@ -# panther_light +# husarion_ugv_lights ## LED Animations @@ -44,7 +44,7 @@ The `segments_map` section allows creating named groups of segments on which ani The `led_animations` section contains a list with definitions for various animations that can be displayed on the LED segments. Supported keys are: - `animations` [*list*, default: **None**]: definition of animation for each Bumper Lights. Supported keys are: - - `type` [*string*, default **None**]: Specifies the type of animation. Default animation types are: `panther_lights::ImageAnimation`, `panther_lights::ChargingAnimation`. + - `type` [*string*, default **None**]: Specifies the type of animation. Default animation types are: `husarion_ugv_lights::ImageAnimation`, `husarion_ugv_lights::ChargingAnimation`. - `segments` [*string*, default **None**]: Indicates which segment mapping this particular animation applies to (e.g., all, front, rear). - `animation` [*yaml*, default: **None**]: An animation to be displayed on segments. The keys for the configuration of different animation types are explained in detail under the [**Animation Types**](#animation-types) section. - `id` [*int*, default: **None**]: unique ID of an animation. @@ -70,14 +70,14 @@ Basic animation definition. Keys are inherited from the basic **Animation** clas #### ImageAnimation -Animation of type `panther_lights::ImageAnimation`, returns frames to display based on a supplied image. Extends `Animation` with keys: +Animation of type `husarion_ugv_lights::ImageAnimation`, returns frames to display based on a supplied image. Extends `Animation` with keys: - `color` [*int*, default: **None**]: The image is turned into grayscale, and then the color is applied with brightness from the gray image. Values have to be in HEX format. This parameter is not required. - `image` [*string*, default: **None**]: path to an image file. Only global paths are valid. Allows using `$(find ros_package)` syntax. #### ChargingAnimation -Animation of type `panther_lights::ChargingAnimation`, returns frame to display based on `param` value representing Battery percentage. Displays a solid color with a duty cycle proportional to the Battery percentage. The color is changing from red (Battery discharged) to green (Battery fully charged). +Animation of type `husarion_ugv_lights::ChargingAnimation`, returns frame to display based on `param` value representing Battery percentage. Displays a solid color with a duty cycle proportional to the Battery percentage. The color is changing from red (Battery discharged) to green (Battery fully charged). ### Defining Animations @@ -93,10 +93,10 @@ user_animations: name: ANIMATION_1 priority: 2 animations: - - type: panther_lights::ImageAnimation + - type: husarion_ugv_lights::ImageAnimation segments: all animation: - image: $(find panther_lights)/animations/strip01_red.png + image: $(find husarion_ugv_lights)/animations/strip01_red.png duration: 2 repeat: 2 color: 0xffff00 @@ -106,7 +106,7 @@ user_animations: name: ANIMATION_2 priority: 3 animations: - - type: panther_lights::ImageAnimation + - type: husarion_ugv_lights::ImageAnimation segments: all animation: image: /animations/custom_image.png @@ -118,7 +118,7 @@ user_animations: name: ANIMATION_3 priority: 3 animations: - - type: panther_lights::ImageAnimation + - type: husarion_ugv_lights::ImageAnimation segments: all animation: image: $(find custom_pkg)/animations/custom_image.png @@ -130,13 +130,13 @@ user_animations: name: ANIMATION_4 priority: 3 animations: - - type: panther_lights::ImageAnimation + - type: husarion_ugv_lights::ImageAnimation segments: front animation: image: $(find custom_pkg)/animations/front_custom_image.png duration: 2 repeat: 2 - - type: panther_lights::ImageAnimation + - type: husarion_ugv_lights::ImageAnimation segments: rear animation: image: $(find custom_pkg)/animations/rear_custom_image.png @@ -152,7 +152,7 @@ user_animations: Remember to modify launch command to use user animations: ``` bash -ros2 launch panther_bringup bringup.launch user_animations_file:=/my_awesome_user_animations.yaml +ros2 launch husarion_ugv_bringup bringup.launch user_animations_file:=/my_awesome_user_animations.yaml ``` Test new animations: diff --git a/panther_lights/LIGHTS_API.md b/husarion_ugv_lights/LIGHTS_API.md similarity index 92% rename from panther_lights/LIGHTS_API.md rename to husarion_ugv_lights/LIGHTS_API.md index 4def8a0e5..cef272ade 100644 --- a/panther_lights/LIGHTS_API.md +++ b/husarion_ugv_lights/LIGHTS_API.md @@ -35,7 +35,7 @@ Getters: ## Defining a New Animation Type -It is possible to define your own animation type with expected, new behavior. All animation definitions inherit from the basic `Animation` class. Animations are loaded using `pluginlib` and can be defined from any point in your project. All you need is to import `Animation` class from `panther_lights` package and export it as a pluginlib plugin. For more information about creating and managing pluginlib see: [Creating and using plugins (C++)](https://docs.ros.org/en/humble/Tutorials/Beginner-Client-Libraries/Pluginlib.html). +It is possible to define your own animation type with expected, new behavior. All animation definitions inherit from the basic `Animation` class. Animations are loaded using `pluginlib` and can be defined from any point in your project. All you need is to import `Animation` class from `husarion_ugv_lights` package and export it as a pluginlib plugin. For more information about creating and managing pluginlib see: [Creating and using plugins (C++)](https://docs.ros.org/en/humble/Tutorials/Beginner-Client-Libraries/Pluginlib.html). Frames are processed in ticks with a frequency of `controller_frequency`. It is required to overwrite the `UpdateFrame` method which must return a list representing the frame for a given tick. The advised way is to use the `GetAnimationIteration` (current animation tick) as a time base for animation frames. The length of the frame has to match `num_led`. Each element of the frame represents a color for a single LED in the Bumper Lights. Colors are described as a list of integers with respective **R**, **G**, and **B** color values and **A** alpha channel. Additional parameters (e.g. image path) can be passed within `animation_description` and processed inside `Initialize` method. See the example below or other animation definitions. @@ -49,7 +49,7 @@ Create a New Animation Type: #include "yaml-cpp/yaml.h" -#include "panther_lights/animation/animation.hpp" +#include "husarion_ugv_lights/animation/animation.hpp" class MyCoolAnimation : public Animation { diff --git a/panther_lights/README.md b/husarion_ugv_lights/README.md similarity index 81% rename from panther_lights/README.md rename to husarion_ugv_lights/README.md index 548b04033..50a8c4e69 100644 --- a/panther_lights/README.md +++ b/husarion_ugv_lights/README.md @@ -1,12 +1,12 @@ -# panther_lights +# husarion_ugv_lights -Package used to control the Husarion Panther Bumper Lights. +Package used to control the Husarion UGV robot's lights. ## Launch files This package contains: -- `lights.launch.py`: Responsible for launching the nodes required to control the Panther Bumper Lights. +- `lights.launch.py`: Responsible for launching the nodes required to control the robot's lights. ## Configuration Files @@ -17,7 +17,7 @@ This package contains: ### LightsControllerNode -This node is of type rclcpp_components is responsible for processing animations and publishing frames to be displayed on the Husarion Panther robot Bumper Lights. +This node is of type rclcpp_components is responsible for processing animations and publishing frames to `light_driver` node. #### Publishers @@ -30,13 +30,13 @@ This node is of type rclcpp_components is responsible for processing animations #### Parameters -- `~animations_config_path` [*string*, default: **$(find panther_lights)/panther_lights/config/{robot_model}_animations.yaml**]: Path to a YAML file with a description of led configuration. This file includes definition of robot panels, virtual segments and default animations. +- `~animations_config_path` [*string*, default: **$(find husarion_ugv_lights)/husarion_ugv_lights/config/{robot_model}_animations.yaml**]: Path to a YAML file with a description of led configuration. This file includes definition of robot panels, virtual segments and default animations. - `~controller_frequency` [*float*, default: **50.0**]: Frequency [Hz] at which the lights controller node will process animations. - `~user_led_animations_path` [*string*, default: **None**]: Path to a YAML file with a description of the user defined animations. ### LightsDriverNode -This node is of type rclcpp_components is responsible for displaying frames on the Husarion Panther robot's Bumper Lights. +This node is of type rclcpp_components is responsible for displaying frames on the robot's lights. #### Publishers diff --git a/panther_lights/animations/lynx/battery_critical.png b/husarion_ugv_lights/animations/lynx/battery_critical.png similarity index 100% rename from panther_lights/animations/lynx/battery_critical.png rename to husarion_ugv_lights/animations/lynx/battery_critical.png diff --git a/panther_lights/animations/lynx/battery_low.png b/husarion_ugv_lights/animations/lynx/battery_low.png similarity index 100% rename from panther_lights/animations/lynx/battery_low.png rename to husarion_ugv_lights/animations/lynx/battery_low.png diff --git a/panther_lights/animations/lynx/strip01_purple.png b/husarion_ugv_lights/animations/lynx/strip01_purple.png similarity index 100% rename from panther_lights/animations/lynx/strip01_purple.png rename to husarion_ugv_lights/animations/lynx/strip01_purple.png diff --git a/panther_lights/animations/lynx/strip01_red.png b/husarion_ugv_lights/animations/lynx/strip01_red.png similarity index 100% rename from panther_lights/animations/lynx/strip01_red.png rename to husarion_ugv_lights/animations/lynx/strip01_red.png diff --git a/panther_lights/animations/lynx/triangle01_blue.png b/husarion_ugv_lights/animations/lynx/triangle01_blue.png similarity index 100% rename from panther_lights/animations/lynx/triangle01_blue.png rename to husarion_ugv_lights/animations/lynx/triangle01_blue.png diff --git a/panther_lights/animations/lynx/triangle01_cyan.png b/husarion_ugv_lights/animations/lynx/triangle01_cyan.png similarity index 100% rename from panther_lights/animations/lynx/triangle01_cyan.png rename to husarion_ugv_lights/animations/lynx/triangle01_cyan.png diff --git a/panther_lights/animations/lynx/triangle01_green.png b/husarion_ugv_lights/animations/lynx/triangle01_green.png similarity index 100% rename from panther_lights/animations/lynx/triangle01_green.png rename to husarion_ugv_lights/animations/lynx/triangle01_green.png diff --git a/panther_lights/animations/lynx/triangle01_orange.png b/husarion_ugv_lights/animations/lynx/triangle01_orange.png similarity index 100% rename from panther_lights/animations/lynx/triangle01_orange.png rename to husarion_ugv_lights/animations/lynx/triangle01_orange.png diff --git a/panther_lights/animations/lynx/triangle01_purple.png b/husarion_ugv_lights/animations/lynx/triangle01_purple.png similarity index 100% rename from panther_lights/animations/lynx/triangle01_purple.png rename to husarion_ugv_lights/animations/lynx/triangle01_purple.png diff --git a/panther_lights/animations/lynx/triangle01_red.png b/husarion_ugv_lights/animations/lynx/triangle01_red.png similarity index 100% rename from panther_lights/animations/lynx/triangle01_red.png rename to husarion_ugv_lights/animations/lynx/triangle01_red.png diff --git a/panther_lights/animations/lynx/triangle01_yellow.png b/husarion_ugv_lights/animations/lynx/triangle01_yellow.png similarity index 100% rename from panther_lights/animations/lynx/triangle01_yellow.png rename to husarion_ugv_lights/animations/lynx/triangle01_yellow.png diff --git a/panther_lights/animations/panther/battery_critical.png b/husarion_ugv_lights/animations/panther/battery_critical.png similarity index 100% rename from panther_lights/animations/panther/battery_critical.png rename to husarion_ugv_lights/animations/panther/battery_critical.png diff --git a/panther_lights/animations/panther/battery_low.png b/husarion_ugv_lights/animations/panther/battery_low.png similarity index 100% rename from panther_lights/animations/panther/battery_low.png rename to husarion_ugv_lights/animations/panther/battery_low.png diff --git a/panther_lights/animations/panther/strip01_purple.png b/husarion_ugv_lights/animations/panther/strip01_purple.png similarity index 100% rename from panther_lights/animations/panther/strip01_purple.png rename to husarion_ugv_lights/animations/panther/strip01_purple.png diff --git a/panther_lights/animations/panther/strip01_red.png b/husarion_ugv_lights/animations/panther/strip01_red.png similarity index 100% rename from panther_lights/animations/panther/strip01_red.png rename to husarion_ugv_lights/animations/panther/strip01_red.png diff --git a/panther_lights/animations/panther/triangle01_blue.png b/husarion_ugv_lights/animations/panther/triangle01_blue.png similarity index 100% rename from panther_lights/animations/panther/triangle01_blue.png rename to husarion_ugv_lights/animations/panther/triangle01_blue.png diff --git a/panther_lights/animations/panther/triangle01_cyan.png b/husarion_ugv_lights/animations/panther/triangle01_cyan.png similarity index 100% rename from panther_lights/animations/panther/triangle01_cyan.png rename to husarion_ugv_lights/animations/panther/triangle01_cyan.png diff --git a/panther_lights/animations/panther/triangle01_green.png b/husarion_ugv_lights/animations/panther/triangle01_green.png similarity index 100% rename from panther_lights/animations/panther/triangle01_green.png rename to husarion_ugv_lights/animations/panther/triangle01_green.png diff --git a/panther_lights/animations/panther/triangle01_orange.png b/husarion_ugv_lights/animations/panther/triangle01_orange.png similarity index 100% rename from panther_lights/animations/panther/triangle01_orange.png rename to husarion_ugv_lights/animations/panther/triangle01_orange.png diff --git a/panther_lights/animations/panther/triangle01_purple.png b/husarion_ugv_lights/animations/panther/triangle01_purple.png similarity index 100% rename from panther_lights/animations/panther/triangle01_purple.png rename to husarion_ugv_lights/animations/panther/triangle01_purple.png diff --git a/panther_lights/animations/panther/triangle01_red.png b/husarion_ugv_lights/animations/panther/triangle01_red.png similarity index 100% rename from panther_lights/animations/panther/triangle01_red.png rename to husarion_ugv_lights/animations/panther/triangle01_red.png diff --git a/panther_lights/animations/panther/triangle01_yellow.png b/husarion_ugv_lights/animations/panther/triangle01_yellow.png similarity index 100% rename from panther_lights/animations/panther/triangle01_yellow.png rename to husarion_ugv_lights/animations/panther/triangle01_yellow.png diff --git a/panther_lights/config/lynx_animations.yaml b/husarion_ugv_lights/config/lynx_animations.yaml similarity index 61% rename from panther_lights/config/lynx_animations.yaml rename to husarion_ugv_lights/config/lynx_animations.yaml index a697e5e38..765c974f8 100644 --- a/panther_lights/config/lynx_animations.yaml +++ b/husarion_ugv_lights/config/lynx_animations.yaml @@ -28,30 +28,30 @@ led_animations: name: E_STOP priority: 3 animations: - - type: panther_lights::ImageAnimation + - type: husarion_ugv_lights::ImageAnimation segments: all animation: - image: $(find panther_lights)/animations/lynx/triangle01_red.png + image: $(find husarion_ugv_lights)/animations/lynx/triangle01_red.png duration: 2 - id: 1 name: READY priority: 3 animations: - - type: panther_lights::ImageAnimation + - type: husarion_ugv_lights::ImageAnimation segments: all animation: - image: $(find panther_lights)/animations/lynx/triangle01_green.png + image: $(find husarion_ugv_lights)/animations/lynx/triangle01_green.png duration: 2 - id: 2 name: ERROR priority: 1 animations: - - type: panther_lights::ImageAnimation + - type: husarion_ugv_lights::ImageAnimation segments: all animation: - image: $(find panther_lights)/animations/lynx/strip01_red.png + image: $(find husarion_ugv_lights)/animations/lynx/strip01_red.png duration: 3 repeat: 2 @@ -59,30 +59,30 @@ led_animations: name: MANUAL_ACTION priority: 3 animations: - - type: panther_lights::ImageAnimation + - type: husarion_ugv_lights::ImageAnimation segments: all animation: - image: $(find panther_lights)/animations/lynx/triangle01_blue.png + image: $(find husarion_ugv_lights)/animations/lynx/triangle01_blue.png duration: 3 - id: 4 name: AUTONOMOUS_ACTION priority: 3 animations: - - type: panther_lights::ImageAnimation + - type: husarion_ugv_lights::ImageAnimation segments: all animation: - image: $(find panther_lights)/animations/lynx/triangle01_orange.png + image: $(find husarion_ugv_lights)/animations/lynx/triangle01_orange.png duration: 3 - id: 5 name: GOAL_ACHIEVED priority: 2 animations: - - type: panther_lights::ImageAnimation + - type: husarion_ugv_lights::ImageAnimation segments: all animation: - image: $(find panther_lights)/animations/lynx/strip01_purple.png + image: $(find husarion_ugv_lights)/animations/lynx/strip01_purple.png duration: 3 repeat: 2 @@ -90,10 +90,10 @@ led_animations: name: LOW_BATTERY priority: 2 animations: - - type: panther_lights::ImageAnimation + - type: husarion_ugv_lights::ImageAnimation segments: all animation: - image: $(find panther_lights)/animations/lynx/battery_low.png + image: $(find husarion_ugv_lights)/animations/lynx/battery_low.png duration: 2 repeat: 2 @@ -101,10 +101,10 @@ led_animations: name: CRITICAL_BATTERY priority: 2 animations: - - type: panther_lights::ImageAnimation + - type: husarion_ugv_lights::ImageAnimation segments: all animation: - image: $(find panther_lights)/animations/lynx/battery_critical.png + image: $(find husarion_ugv_lights)/animations/lynx/battery_critical.png duration: 2 repeat: 2 @@ -115,7 +115,7 @@ led_animations: name: CHARGING_BATTERY priority: 3 animations: - - type: panther_lights::ChargingAnimation + - type: husarion_ugv_lights::ChargingAnimation segments: all animation: duration: 3 diff --git a/panther_lights/config/lynx_driver.yaml b/husarion_ugv_lights/config/lynx_driver.yaml similarity index 100% rename from panther_lights/config/lynx_driver.yaml rename to husarion_ugv_lights/config/lynx_driver.yaml diff --git a/panther_lights/config/panther_animations.yaml b/husarion_ugv_lights/config/panther_animations.yaml similarity index 60% rename from panther_lights/config/panther_animations.yaml rename to husarion_ugv_lights/config/panther_animations.yaml index aa766cdb4..ea92b4130 100644 --- a/panther_lights/config/panther_animations.yaml +++ b/husarion_ugv_lights/config/panther_animations.yaml @@ -22,30 +22,30 @@ led_animations: name: E_STOP priority: 3 animations: - - type: panther_lights::ImageAnimation + - type: husarion_ugv_lights::ImageAnimation segments: all animation: - image: $(find panther_lights)/animations/panther/triangle01_red.png + image: $(find husarion_ugv_lights)/animations/panther/triangle01_red.png duration: 2 - id: 1 name: READY priority: 3 animations: - - type: panther_lights::ImageAnimation + - type: husarion_ugv_lights::ImageAnimation segments: all animation: - image: $(find panther_lights)/animations/panther/triangle01_green.png + image: $(find husarion_ugv_lights)/animations/panther/triangle01_green.png duration: 2 - id: 2 name: ERROR priority: 1 animations: - - type: panther_lights::ImageAnimation + - type: husarion_ugv_lights::ImageAnimation segments: all animation: - image: $(find panther_lights)/animations/panther/strip01_red.png + image: $(find husarion_ugv_lights)/animations/panther/strip01_red.png duration: 3 repeat: 2 @@ -53,30 +53,30 @@ led_animations: name: MANUAL_ACTION priority: 3 animations: - - type: panther_lights::ImageAnimation + - type: husarion_ugv_lights::ImageAnimation segments: all animation: - image: $(find panther_lights)/animations/panther/triangle01_blue.png + image: $(find husarion_ugv_lights)/animations/panther/triangle01_blue.png duration: 3 - id: 4 name: AUTONOMOUS_ACTION priority: 3 animations: - - type: panther_lights::ImageAnimation + - type: husarion_ugv_lights::ImageAnimation segments: all animation: - image: $(find panther_lights)/animations/panther/triangle01_orange.png + image: $(find husarion_ugv_lights)/animations/panther/triangle01_orange.png duration: 3 - id: 5 name: GOAL_ACHIEVED priority: 2 animations: - - type: panther_lights::ImageAnimation + - type: husarion_ugv_lights::ImageAnimation segments: all animation: - image: $(find panther_lights)/animations/panther/strip01_purple.png + image: $(find husarion_ugv_lights)/animations/panther/strip01_purple.png duration: 3 repeat: 2 @@ -84,10 +84,10 @@ led_animations: name: LOW_BATTERY priority: 2 animations: - - type: panther_lights::ImageAnimation + - type: husarion_ugv_lights::ImageAnimation segments: all animation: - image: $(find panther_lights)/animations/panther/battery_low.png + image: $(find husarion_ugv_lights)/animations/panther/battery_low.png duration: 2 repeat: 2 @@ -95,10 +95,10 @@ led_animations: name: CRITICAL_BATTERY priority: 2 animations: - - type: panther_lights::ImageAnimation + - type: husarion_ugv_lights::ImageAnimation segments: all animation: - image: $(find panther_lights)/animations/panther/battery_critical.png + image: $(find husarion_ugv_lights)/animations/panther/battery_critical.png duration: 2 repeat: 2 @@ -109,7 +109,7 @@ led_animations: name: CHARGING_BATTERY priority: 3 animations: - - type: panther_lights::ChargingAnimation + - type: husarion_ugv_lights::ChargingAnimation segments: all animation: duration: 3 diff --git a/panther_lights/config/panther_driver.yaml b/husarion_ugv_lights/config/panther_driver.yaml similarity index 100% rename from panther_lights/config/panther_driver.yaml rename to husarion_ugv_lights/config/panther_driver.yaml diff --git a/panther_lights/include/panther_lights/animation/animation.hpp b/husarion_ugv_lights/include/husarion_ugv_lights/animation/animation.hpp similarity index 91% rename from panther_lights/include/panther_lights/animation/animation.hpp rename to husarion_ugv_lights/include/husarion_ugv_lights/animation/animation.hpp index 9c237b1d3..98c9bf1d1 100644 --- a/panther_lights/include/panther_lights/animation/animation.hpp +++ b/husarion_ugv_lights/include/husarion_ugv_lights/animation/animation.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_LIGHTS_ANIMATION_ANIMATION_HPP_ -#define PANTHER_LIGHTS_ANIMATION_ANIMATION_HPP_ +#ifndef HUSARION_UGV_LIGHTS_ANIMATION_ANIMATION_HPP_ +#define HUSARION_UGV_LIGHTS_ANIMATION_ANIMATION_HPP_ #include #include @@ -25,9 +25,9 @@ #include "yaml-cpp/yaml.h" -#include "panther_utils/yaml_utils.hpp" +#include "husarion_ugv_utils/yaml_utils.hpp" -namespace panther_lights +namespace husarion_ugv_lights { class Animation @@ -53,12 +53,12 @@ class Animation num_led_ = num_led; frame_ = std::vector(num_led_ * kRGBAColorLen, 0); - auto duration = panther_utils::GetYAMLKeyValue(animation_description, "duration"); + auto duration = husarion_ugv_utils::GetYAMLKeyValue(animation_description, "duration"); if ((duration - std::numeric_limits::epsilon()) <= 0.0) { throw std::out_of_range("Duration has to be positive"); } - loops_ = panther_utils::GetYAMLKeyValue(animation_description, "repeat", 1); + loops_ = husarion_ugv_utils::GetYAMLKeyValue(animation_description, "repeat", 1); if (duration * loops_ > 10.0) { throw std::runtime_error("Animation display duration (duration * repeat) exceeds 10 seconds"); @@ -187,6 +187,6 @@ class Animation std::vector frame_; }; -} // namespace panther_lights +} // namespace husarion_ugv_lights -#endif // PANTHER_LIGHTS_ANIMATION_ANIMATION_HPP_ +#endif // HUSARION_UGV_LIGHTS_ANIMATION_ANIMATION_HPP_ diff --git a/panther_lights/include/panther_lights/animation/charging_animation.hpp b/husarion_ugv_lights/include/husarion_ugv_lights/animation/charging_animation.hpp similarity index 83% rename from panther_lights/include/panther_lights/animation/charging_animation.hpp rename to husarion_ugv_lights/include/husarion_ugv_lights/animation/charging_animation.hpp index 95f7ab7bd..2c325bc2a 100644 --- a/panther_lights/include/panther_lights/animation/charging_animation.hpp +++ b/husarion_ugv_lights/include/husarion_ugv_lights/animation/charging_animation.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_LIGHTS_ANIMATION_CHARGING_ANIMATION_HPP_ -#define PANTHER_LIGHTS_ANIMATION_CHARGING_ANIMATION_HPP_ +#ifndef HUSARION_UGV_LIGHTS_ANIMATION_CHARGING_ANIMATION_HPP_ +#define HUSARION_UGV_LIGHTS_ANIMATION_CHARGING_ANIMATION_HPP_ #include #include @@ -22,9 +22,9 @@ #include "yaml-cpp/yaml.h" -#include "panther_lights/animation/animation.hpp" +#include "husarion_ugv_lights/animation/animation.hpp" -namespace panther_lights +namespace husarion_ugv_lights { class ChargingAnimation : public Animation @@ -57,6 +57,6 @@ class ChargingAnimation : public Animation std::array color_; }; -} // namespace panther_lights +} // namespace husarion_ugv_lights -#endif // PANTHER_LIGHTS_ANIMATION_CHARGING_ANIMATION_HPP_ +#endif // HUSARION_UGV_LIGHTS_ANIMATION_CHARGING_ANIMATION_HPP_ diff --git a/panther_lights/include/panther_lights/animation/image_animation.hpp b/husarion_ugv_lights/include/husarion_ugv_lights/animation/image_animation.hpp similarity index 88% rename from panther_lights/include/panther_lights/animation/image_animation.hpp rename to husarion_ugv_lights/include/husarion_ugv_lights/animation/image_animation.hpp index 31663f959..78506908e 100644 --- a/panther_lights/include/panther_lights/animation/image_animation.hpp +++ b/husarion_ugv_lights/include/husarion_ugv_lights/animation/image_animation.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_LIGHTS_ANIMATION_IMAGE_ANIMATION_HPP_ -#define PANTHER_LIGHTS_ANIMATION_IMAGE_ANIMATION_HPP_ +#ifndef HUSARION_UGV_LIGHTS_ANIMATION_IMAGE_ANIMATION_HPP_ +#define HUSARION_UGV_LIGHTS_ANIMATION_IMAGE_ANIMATION_HPP_ #include #include @@ -25,11 +25,11 @@ #include "boost/gil.hpp" #include "boost/gil/extension/toolbox/color_spaces/gray_alpha.hpp" -#include "panther_lights/animation/animation.hpp" +#include "husarion_ugv_lights/animation/animation.hpp" namespace gil = boost::gil; -namespace panther_lights +namespace husarion_ugv_lights { class ImageAnimation : public Animation @@ -77,6 +77,6 @@ class ImageAnimation : public Animation gil::rgba8_image_t image_; }; -} // namespace panther_lights +} // namespace husarion_ugv_lights -#endif // PANTHER_LIGHTS_ANIMATION_IMAGE_ANIMATION_HPP_ +#endif // HUSARION_UGV_LIGHTS_ANIMATION_IMAGE_ANIMATION_HPP_ diff --git a/panther_lights/include/panther_lights/apa102.hpp b/husarion_ugv_lights/include/husarion_ugv_lights/apa102.hpp similarity index 96% rename from panther_lights/include/panther_lights/apa102.hpp rename to husarion_ugv_lights/include/husarion_ugv_lights/apa102.hpp index 801a0610c..f58ed2407 100644 --- a/panther_lights/include/panther_lights/apa102.hpp +++ b/husarion_ugv_lights/include/husarion_ugv_lights/apa102.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_LIGHTS_APA102_HPP_ -#define PANTHER_LIGHTS_APA102_HPP_ +#ifndef HUSARION_UGV_LIGHTS_APA102_HPP_ +#define HUSARION_UGV_LIGHTS_APA102_HPP_ #include #include @@ -25,7 +25,7 @@ #include #include -namespace panther_lights +namespace husarion_ugv_lights { class SPIDeviceInterface @@ -165,6 +165,6 @@ class APA102 : public APA102Interface const int file_descriptor_; }; -} // namespace panther_lights +} // namespace husarion_ugv_lights -#endif // PANTHER_LIGHTS_APA102_HPP_ +#endif // HUSARION_UGV_LIGHTS_APA102_HPP_ diff --git a/panther_lights/include/panther_lights/led_components/led_animations_queue.hpp b/husarion_ugv_lights/include/husarion_ugv_lights/led_components/led_animations_queue.hpp similarity index 94% rename from panther_lights/include/panther_lights/led_components/led_animations_queue.hpp rename to husarion_ugv_lights/include/husarion_ugv_lights/led_components/led_animations_queue.hpp index e9fd454d4..6327bfd5e 100644 --- a/panther_lights/include/panther_lights/led_components/led_animations_queue.hpp +++ b/husarion_ugv_lights/include/husarion_ugv_lights/led_components/led_animations_queue.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_LIGHTS_LED_COMPONENTS_LED_ANIMATIONS_QUEUE_HPP_ -#define PANTHER_LIGHTS_LED_COMPONENTS_LED_ANIMATIONS_QUEUE_HPP_ +#ifndef HUSARION_UGV_LIGHTS_LED_COMPONENTS_LED_ANIMATIONS_QUEUE_HPP_ +#define HUSARION_UGV_LIGHTS_LED_COMPONENTS_LED_ANIMATIONS_QUEUE_HPP_ #include #include @@ -27,9 +27,9 @@ #include "rclcpp/time.hpp" -#include "panther_lights/led_components/led_segment.hpp" +#include "husarion_ugv_lights/led_components/led_segment.hpp" -namespace panther_lights +namespace husarion_ugv_lights { /** @@ -189,6 +189,6 @@ class LEDAnimationsQueue const std::size_t max_queue_size_; }; -} // namespace panther_lights +} // namespace husarion_ugv_lights -#endif // PANTHER_LIGHTS_LED_COMPONENTS_LED_ANIMATIONS_QUEUE_HPP_ +#endif // HUSARION_UGV_LIGHTS_LED_COMPONENTS_LED_ANIMATIONS_QUEUE_HPP_ diff --git a/panther_lights/include/panther_lights/led_components/led_panel.hpp b/husarion_ugv_lights/include/husarion_ugv_lights/led_components/led_panel.hpp similarity index 85% rename from panther_lights/include/panther_lights/led_components/led_panel.hpp rename to husarion_ugv_lights/include/husarion_ugv_lights/led_components/led_panel.hpp index 06d8def53..71719dcb4 100644 --- a/panther_lights/include/panther_lights/led_components/led_panel.hpp +++ b/husarion_ugv_lights/include/husarion_ugv_lights/led_components/led_panel.hpp @@ -12,13 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_LIGHTS_LED_COMPONENTS_LED_PANEL_HPP_ -#define PANTHER_LIGHTS_LED_COMPONENTS_LED_PANEL_HPP_ +#ifndef HUSARION_UGV_LIGHTS_LED_COMPONENTS_LED_PANEL_HPP_ +#define HUSARION_UGV_LIGHTS_LED_COMPONENTS_LED_PANEL_HPP_ #include #include -namespace panther_lights +namespace husarion_ugv_lights { /** @@ -49,6 +49,6 @@ class LEDPanel std::vector frame_; }; -} // namespace panther_lights +} // namespace husarion_ugv_lights -#endif // PANTHER_LIGHTS_LED_COMPONENTS_LED_PANEL_HPP_ +#endif // HUSARION_UGV_LIGHTS_LED_COMPONENTS_LED_PANEL_HPP_ diff --git a/panther_lights/include/panther_lights/led_components/led_segment.hpp b/husarion_ugv_lights/include/husarion_ugv_lights/led_components/led_segment.hpp similarity index 87% rename from panther_lights/include/panther_lights/led_components/led_segment.hpp rename to husarion_ugv_lights/include/husarion_ugv_lights/led_components/led_segment.hpp index 91b037244..5133d947f 100644 --- a/panther_lights/include/panther_lights/led_components/led_segment.hpp +++ b/husarion_ugv_lights/include/husarion_ugv_lights/led_components/led_segment.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_LIGHTS_LED_COMPONENTS_LED_SEGMENT_HPP_ -#define PANTHER_LIGHTS_LED_COMPONENTS_LED_SEGMENT_HPP_ +#ifndef HUSARION_UGV_LIGHTS_LED_COMPONENTS_LED_SEGMENT_HPP_ +#define HUSARION_UGV_LIGHTS_LED_COMPONENTS_LED_SEGMENT_HPP_ #include #include @@ -22,9 +22,9 @@ #include "pluginlib/class_loader.hpp" -#include "panther_lights/animation/animation.hpp" +#include "husarion_ugv_lights/animation/animation.hpp" -namespace panther_lights +namespace husarion_ugv_lights { /** @@ -117,8 +117,8 @@ class LEDSegment bool HasAnimation() const { return animation_ || default_animation_; } protected: - std::shared_ptr animation_; - std::shared_ptr default_animation_; + std::shared_ptr animation_; + std::shared_ptr default_animation_; private: const float controller_frequency_; @@ -129,9 +129,9 @@ class LEDSegment std::size_t last_led_iterator_; std::size_t num_led_; - std::shared_ptr> animation_loader_; + std::shared_ptr> animation_loader_; }; -} // namespace panther_lights +} // namespace husarion_ugv_lights -#endif // PANTHER_LIGHTS_LED_COMPONENTS_LED_SEGMENT_HPP_ +#endif // HUSARION_UGV_LIGHTS_LED_COMPONENTS_LED_SEGMENT_HPP_ diff --git a/panther_lights/include/panther_lights/led_components/segment_converter.hpp b/husarion_ugv_lights/include/husarion_ugv_lights/led_components/segment_converter.hpp similarity index 70% rename from panther_lights/include/panther_lights/led_components/segment_converter.hpp rename to husarion_ugv_lights/include/husarion_ugv_lights/led_components/segment_converter.hpp index fba745cde..1d23cbc8f 100644 --- a/panther_lights/include/panther_lights/led_components/segment_converter.hpp +++ b/husarion_ugv_lights/include/husarion_ugv_lights/led_components/segment_converter.hpp @@ -12,17 +12,17 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_LIGHTS_LED_COMPONENTS_SEGMENT_CONVERTER_HPP_ -#define PANTHER_LIGHTS_LED_COMPONENTS_SEGMENT_CONVERTER_HPP_ +#ifndef HUSARION_UGV_LIGHTS_LED_COMPONENTS_SEGMENT_CONVERTER_HPP_ +#define HUSARION_UGV_LIGHTS_LED_COMPONENTS_SEGMENT_CONVERTER_HPP_ #include #include #include -#include "panther_lights/led_components/led_panel.hpp" -#include "panther_lights/led_components/led_segment.hpp" +#include "husarion_ugv_lights/led_components/led_panel.hpp" +#include "husarion_ugv_lights/led_components/led_segment.hpp" -namespace panther_lights +namespace husarion_ugv_lights { class SegmentConverter @@ -36,6 +36,6 @@ class SegmentConverter const std::unordered_map> & panels); }; -} // namespace panther_lights +} // namespace husarion_ugv_lights -#endif // PANTHER_LIGHTS_LED_COMPONENTS_SEGMENT_CONVERTER_HPP_ +#endif // HUSARION_UGV_LIGHTS_LED_COMPONENTS_SEGMENT_CONVERTER_HPP_ diff --git a/panther_lights/include/panther_lights/lights_controller_node.hpp b/husarion_ugv_lights/include/husarion_ugv_lights/lights_controller_node.hpp similarity index 91% rename from panther_lights/include/panther_lights/lights_controller_node.hpp rename to husarion_ugv_lights/include/husarion_ugv_lights/lights_controller_node.hpp index eb98f16f9..fc7b61cc6 100644 --- a/panther_lights/include/panther_lights/lights_controller_node.hpp +++ b/husarion_ugv_lights/include/husarion_ugv_lights/lights_controller_node.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_LIGHTS_LIGHTS_CONTROLLER_NODE_HPP_ -#define PANTHER_LIGHTS_LIGHTS_CONTROLLER_NODE_HPP_ +#ifndef HUSARION_UGV_LIGHTS_LIGHTS_CONTROLLER_NODE_HPP_ +#define HUSARION_UGV_LIGHTS_LIGHTS_CONTROLLER_NODE_HPP_ #include #include @@ -27,12 +27,12 @@ #include "panther_msgs/srv/set_led_animation.hpp" -#include "panther_lights/animation/animation.hpp" -#include "panther_lights/led_components/led_animations_queue.hpp" -#include "panther_lights/led_components/segment_converter.hpp" -#include "panther_utils/yaml_utils.hpp" +#include "husarion_ugv_lights/animation/animation.hpp" +#include "husarion_ugv_lights/led_components/led_animations_queue.hpp" +#include "husarion_ugv_lights/led_components/segment_converter.hpp" +#include "husarion_ugv_utils/yaml_utils.hpp" -namespace panther_lights +namespace husarion_ugv_lights { using ImageMsg = sensor_msgs::msg::Image; @@ -154,6 +154,6 @@ class LightsControllerNode : public rclcpp::Node bool animation_finished_ = true; }; -} // namespace panther_lights +} // namespace husarion_ugv_lights -#endif // PANTHER_LIGHTS_LIGHTS_CONTROLLER_NODE_HPP_ +#endif // HUSARION_UGV_LIGHTS_LIGHTS_CONTROLLER_NODE_HPP_ diff --git a/panther_lights/include/panther_lights/lights_driver_node.hpp b/husarion_ugv_lights/include/husarion_ugv_lights/lights_driver_node.hpp similarity index 94% rename from panther_lights/include/panther_lights/lights_driver_node.hpp rename to husarion_ugv_lights/include/husarion_ugv_lights/lights_driver_node.hpp index f1a4b5b5c..0a5de4ae7 100644 --- a/panther_lights/include/panther_lights/lights_driver_node.hpp +++ b/husarion_ugv_lights/include/husarion_ugv_lights/lights_driver_node.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_LIGHTS_LIGHTS_DRIVER_NODE_HPP_ -#define PANTHER_LIGHTS_LIGHTS_DRIVER_NODE_HPP_ +#ifndef HUSARION_UGV_LIGHTS_LIGHTS_DRIVER_NODE_HPP_ +#define HUSARION_UGV_LIGHTS_LIGHTS_DRIVER_NODE_HPP_ #include #include @@ -26,9 +26,9 @@ #include "panther_msgs/srv/set_led_brightness.hpp" -#include "panther_lights/apa102.hpp" +#include "husarion_ugv_lights/apa102.hpp" -namespace panther_lights +namespace husarion_ugv_lights { using ImageMsg = sensor_msgs::msg::Image; @@ -133,6 +133,6 @@ class LightsDriverNode : public rclcpp::Node diagnostic_updater::Updater diagnostic_updater_; }; -} // namespace panther_lights +} // namespace husarion_ugv_lights -#endif // PANTHER_LIGHTS_LIGHTS_DRIVER_NODE_HPP_ +#endif // HUSARION_UGV_LIGHTS_LIGHTS_DRIVER_NODE_HPP_ diff --git a/panther_lights/launch/lights.launch.py b/husarion_ugv_lights/launch/lights.launch.py similarity index 93% rename from panther_lights/launch/lights.launch.py rename to husarion_ugv_lights/launch/lights.launch.py index f77ef14dc..fa45aa530 100644 --- a/panther_lights/launch/lights.launch.py +++ b/husarion_ugv_lights/launch/lights.launch.py @@ -33,7 +33,7 @@ def generate_launch_description(): robot_model = LaunchConfiguration("robot_model") - lights_pkg = FindPackageShare("panther_lights") + lights_pkg = FindPackageShare("husarion_ugv_lights") animations_config = PythonExpression(["'", robot_model, "_animations.yaml'"]) animations_config_path = LaunchConfiguration("animations_config_path") @@ -82,8 +82,8 @@ def generate_launch_description(): executable="component_container", composable_node_descriptions=[ ComposableNode( - package="panther_lights", - plugin="panther_lights::LightsDriverNode", + package="husarion_ugv_lights", + plugin="husarion_ugv_lights::LightsDriverNode", name="lights_driver", namespace=namespace, remappings=[("/diagnostics", "diagnostics")], @@ -94,8 +94,8 @@ def generate_launch_description(): condition=UnlessCondition(use_sim), ), ComposableNode( - package="panther_lights", - plugin="panther_lights::LightsControllerNode", + package="husarion_ugv_lights", + plugin="husarion_ugv_lights::LightsControllerNode", name="lights_controller", namespace=namespace, parameters=[ diff --git a/panther_lights/package.xml b/husarion_ugv_lights/package.xml similarity index 88% rename from panther_lights/package.xml rename to husarion_ugv_lights/package.xml index 2dfb2248c..8e68c10c8 100644 --- a/panther_lights/package.xml +++ b/husarion_ugv_lights/package.xml @@ -1,9 +1,9 @@ - panther_lights + husarion_ugv_lights 2.1.1 - Package used to control the Husarion Panther Bumper Lights + Package used to control the robot lights Husarion Apache License 2.0 @@ -17,10 +17,10 @@ ament_cmake diagnostic_updater + husarion_ugv_utils image_transport libpng-dev panther_msgs - panther_utils pluginlib rclcpp rclcpp_components diff --git a/husarion_ugv_lights/plugins.xml b/husarion_ugv_lights/plugins.xml new file mode 100644 index 000000000..5b4995460 --- /dev/null +++ b/husarion_ugv_lights/plugins.xml @@ -0,0 +1,8 @@ + + + Animation processed from an image + + + Charging animation representing percentage of battery + + diff --git a/panther_lights/src/animation/charging_animation.cpp b/husarion_ugv_lights/src/animation/charging_animation.cpp similarity index 95% rename from panther_lights/src/animation/charging_animation.cpp rename to husarion_ugv_lights/src/animation/charging_animation.cpp index 9a02d6b78..4aeec55de 100644 --- a/panther_lights/src/animation/charging_animation.cpp +++ b/husarion_ugv_lights/src/animation/charging_animation.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_lights/animation/charging_animation.hpp" +#include "husarion_ugv_lights/animation/charging_animation.hpp" #include #include @@ -25,7 +25,7 @@ #include "yaml-cpp/yaml.h" -namespace panther_lights +namespace husarion_ugv_lights { void ChargingAnimation::Initialize( @@ -153,8 +153,8 @@ std::vector ChargingAnimation::CreateRGBAFrame( return frame; } -} // namespace panther_lights +} // namespace husarion_ugv_lights #include "pluginlib/class_list_macros.hpp" -PLUGINLIB_EXPORT_CLASS(panther_lights::ChargingAnimation, panther_lights::Animation) +PLUGINLIB_EXPORT_CLASS(husarion_ugv_lights::ChargingAnimation, husarion_ugv_lights::Animation) diff --git a/panther_lights/src/animation/image_animation.cpp b/husarion_ugv_lights/src/animation/image_animation.cpp similarity index 93% rename from panther_lights/src/animation/image_animation.cpp rename to husarion_ugv_lights/src/animation/image_animation.cpp index 5cc68f08a..ab7d9cd9e 100644 --- a/panther_lights/src/animation/image_animation.cpp +++ b/husarion_ugv_lights/src/animation/image_animation.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_lights/animation/image_animation.hpp" +#include "husarion_ugv_lights/animation/image_animation.hpp" #include #include @@ -30,9 +30,9 @@ #include "boost/gil/extension/numeric/resample.hpp" #include "boost/gil/extension/numeric/sampler.hpp" -#include "panther_utils/yaml_utils.hpp" +#include "husarion_ugv_utils/yaml_utils.hpp" -namespace panther_lights +namespace husarion_ugv_lights { void ImageAnimation::Initialize( @@ -41,8 +41,8 @@ void ImageAnimation::Initialize( { Animation::Initialize(animation_description, num_led, controller_frequency); - const auto image_path = - ParseImagePath(panther_utils::GetYAMLKeyValue(animation_description, "image")); + const auto image_path = ParseImagePath( + husarion_ugv_utils::GetYAMLKeyValue(animation_description, "image")); gil::rgba8_image_t base_image; gil::read_and_convert_image(std::string(image_path), base_image, gil::png_tag()); image_ = RGBAImageResize(base_image, this->GetNumberOfLeds(), this->GetAnimationLength()); @@ -156,8 +156,8 @@ void ImageAnimation::GreyImageNormalizeBrightness(gil::gray_alpha8_image_t & ima }); } -} // namespace panther_lights +} // namespace husarion_ugv_lights #include "pluginlib/class_list_macros.hpp" -PLUGINLIB_EXPORT_CLASS(panther_lights::ImageAnimation, panther_lights::Animation) +PLUGINLIB_EXPORT_CLASS(husarion_ugv_lights::ImageAnimation, husarion_ugv_lights::Animation) diff --git a/panther_lights/src/apa102.cpp b/husarion_ugv_lights/src/apa102.cpp similarity index 97% rename from panther_lights/src/apa102.cpp rename to husarion_ugv_lights/src/apa102.cpp index 8a2a70aa6..df35f857e 100644 --- a/panther_lights/src/apa102.cpp +++ b/husarion_ugv_lights/src/apa102.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_lights/apa102.hpp" +#include "husarion_ugv_lights/apa102.hpp" #include #include @@ -22,7 +22,7 @@ #include #include -namespace panther_lights +namespace husarion_ugv_lights { APA102::APA102( @@ -126,4 +126,4 @@ void APA102::SPISendBuffer(const std::vector & buffer) const } } -} // namespace panther_lights +} // namespace husarion_ugv_lights diff --git a/panther_lights/src/led_components/led_animations_queue.cpp b/husarion_ugv_lights/src/led_components/led_animations_queue.cpp similarity index 96% rename from panther_lights/src/led_components/led_animations_queue.cpp rename to husarion_ugv_lights/src/led_components/led_animations_queue.cpp index 0d295ab05..6a0aa04ff 100644 --- a/panther_lights/src/led_components/led_animations_queue.cpp +++ b/husarion_ugv_lights/src/led_components/led_animations_queue.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_lights/led_components/led_animations_queue.hpp" +#include "husarion_ugv_lights/led_components/led_animations_queue.hpp" #include #include @@ -23,7 +23,7 @@ #include "rclcpp/logging.hpp" #include "rclcpp/time.hpp" -namespace panther_lights +namespace husarion_ugv_lights { LEDAnimation::LEDAnimation( @@ -148,4 +148,4 @@ bool LEDAnimationsQueue::HasAnimation(const std::shared_ptr & anim return std::find(queue_.begin(), queue_.end(), animation) != queue_.end(); } -} // namespace panther_lights +} // namespace husarion_ugv_lights diff --git a/panther_lights/src/led_components/led_panel.cpp b/husarion_ugv_lights/src/led_components/led_panel.cpp similarity index 93% rename from panther_lights/src/led_components/led_panel.cpp rename to husarion_ugv_lights/src/led_components/led_panel.cpp index 46820f178..6107e1eac 100644 --- a/panther_lights/src/led_components/led_panel.cpp +++ b/husarion_ugv_lights/src/led_components/led_panel.cpp @@ -12,14 +12,14 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_lights/led_components/led_panel.hpp" +#include "husarion_ugv_lights/led_components/led_panel.hpp" #include #include #include #include -namespace panther_lights +namespace husarion_ugv_lights { LEDPanel::LEDPanel(const std::size_t num_led) : num_led_(num_led) @@ -50,4 +50,4 @@ void LEDPanel::UpdateFrame( std::copy(values.begin(), values.end(), frame_.begin() + iterator_first); } -} // namespace panther_lights +} // namespace husarion_ugv_lights diff --git a/panther_lights/src/led_components/led_segment.cpp b/husarion_ugv_lights/src/led_components/led_segment.cpp similarity index 86% rename from panther_lights/src/led_components/led_segment.cpp rename to husarion_ugv_lights/src/led_components/led_segment.cpp index bd4eaa98e..ef82263de 100644 --- a/panther_lights/src/led_components/led_segment.cpp +++ b/husarion_ugv_lights/src/led_components/led_segment.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_lights/led_components/led_segment.hpp" +#include "husarion_ugv_lights/led_components/led_segment.hpp" #include #include @@ -20,17 +20,17 @@ #include "yaml-cpp/yaml.h" -#include "panther_lights/animation/animation.hpp" -#include "panther_utils/yaml_utils.hpp" +#include "husarion_ugv_lights/animation/animation.hpp" +#include "husarion_ugv_utils/yaml_utils.hpp" -namespace panther_lights +namespace husarion_ugv_lights { LEDSegment::LEDSegment(const YAML::Node & segment_description, const float controller_frequency) : controller_frequency_(controller_frequency) { - channel_ = panther_utils::GetYAMLKeyValue(segment_description, "channel"); - const auto led_range = panther_utils::GetYAMLKeyValue( + channel_ = husarion_ugv_utils::GetYAMLKeyValue(segment_description, "channel"); + const auto led_range = husarion_ugv_utils::GetYAMLKeyValue( segment_description, "led_range"); const std::size_t split_char = led_range.find('-'); @@ -52,8 +52,8 @@ LEDSegment::LEDSegment(const YAML::Node & segment_description, const float contr num_led_ = std::abs(int(last_led_iterator_ - first_led_iterator_)) + 1; - animation_loader_ = std::make_shared>( - "panther_lights", "panther_lights::Animation"); + animation_loader_ = std::make_shared>( + "husarion_ugv_lights", "husarion_ugv_lights::Animation"); } LEDSegment::~LEDSegment() @@ -68,7 +68,7 @@ void LEDSegment::SetAnimation( const std::string & type, const YAML::Node & animation_description, const bool repeating, const std::string & param) { - std::shared_ptr animation; + std::shared_ptr animation; try { animation = animation_loader_->createSharedInstance(type); @@ -107,7 +107,7 @@ void LEDSegment::UpdateAnimation() animation_finished_ = true; } - std::shared_ptr animation_to_update = + std::shared_ptr animation_to_update = animation_finished_ && default_animation_ ? default_animation_ : animation_; if (animation_finished_ && default_animation_ && default_animation_->IsFinished()) { @@ -167,4 +167,4 @@ std::size_t LEDSegment::GetFirstLEDPosition() const return (invert_led_order_ ? last_led_iterator_ : first_led_iterator_) * Animation::kRGBAColorLen; } -} // namespace panther_lights +} // namespace husarion_ugv_lights diff --git a/panther_lights/src/led_components/segment_converter.cpp b/husarion_ugv_lights/src/led_components/segment_converter.cpp similarity index 85% rename from panther_lights/src/led_components/segment_converter.cpp rename to husarion_ugv_lights/src/led_components/segment_converter.cpp index fb1f54dd3..b5ecf372d 100644 --- a/panther_lights/src/led_components/segment_converter.cpp +++ b/husarion_ugv_lights/src/led_components/segment_converter.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_lights/led_components/segment_converter.hpp" +#include "husarion_ugv_lights/led_components/segment_converter.hpp" #include #include @@ -20,10 +20,10 @@ #include #include -#include "panther_lights/led_components/led_panel.hpp" -#include "panther_lights/led_components/led_segment.hpp" +#include "husarion_ugv_lights/led_components/led_panel.hpp" +#include "husarion_ugv_lights/led_components/led_segment.hpp" -namespace panther_lights +namespace husarion_ugv_lights { void SegmentConverter::Convert( @@ -52,4 +52,4 @@ void SegmentConverter::Convert( } } -} // namespace panther_lights +} // namespace husarion_ugv_lights diff --git a/panther_lights/src/lights_controller_node.cpp b/husarion_ugv_lights/src/lights_controller_node.cpp similarity index 86% rename from panther_lights/src/lights_controller_node.cpp rename to husarion_ugv_lights/src/lights_controller_node.cpp index d77443ef7..b54cf25df 100644 --- a/panther_lights/src/lights_controller_node.cpp +++ b/husarion_ugv_lights/src/lights_controller_node.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_lights/lights_controller_node.hpp" +#include "husarion_ugv_lights/lights_controller_node.hpp" #include #include @@ -31,14 +31,14 @@ #include "panther_msgs/srv/set_led_animation.hpp" -#include "panther_lights/led_components/led_animations_queue.hpp" -#include "panther_lights/led_components/led_panel.hpp" -#include "panther_lights/led_components/led_segment.hpp" -#include "panther_lights/led_components/segment_converter.hpp" -#include "panther_utils/ros_utils.hpp" -#include "panther_utils/yaml_utils.hpp" +#include "husarion_ugv_lights/led_components/led_animations_queue.hpp" +#include "husarion_ugv_lights/led_components/led_panel.hpp" +#include "husarion_ugv_lights/led_components/led_segment.hpp" +#include "husarion_ugv_lights/led_components/segment_converter.hpp" +#include "husarion_ugv_utils/ros_utils.hpp" +#include "husarion_ugv_utils/yaml_utils.hpp" -namespace panther_lights +namespace husarion_ugv_lights { LightsControllerNode::LightsControllerNode(const rclcpp::NodeOptions & options) @@ -86,8 +86,8 @@ void LightsControllerNode::InitializeLEDPanels(const YAML::Node & panels_descrip RCLCPP_DEBUG(this->get_logger(), "Initializing LED panels."); for (auto & panel : panels_description.as>()) { - const auto channel = panther_utils::GetYAMLKeyValue(panel, "channel"); - const auto number_of_leds = panther_utils::GetYAMLKeyValue( + const auto channel = husarion_ugv_utils::GetYAMLKeyValue(panel, "channel"); + const auto number_of_leds = husarion_ugv_utils::GetYAMLKeyValue( panel, "number_of_leds"); const auto result = led_panels_.emplace(channel, std::make_unique(number_of_leds)); @@ -115,7 +115,7 @@ void LightsControllerNode::InitializeLEDSegments( RCLCPP_DEBUG(this->get_logger(), "Initializing LED segments."); for (auto & segment : segments_description.as>()) { - const auto segment_name = panther_utils::GetYAMLKeyValue(segment, "name"); + const auto segment_name = husarion_ugv_utils::GetYAMLKeyValue(segment, "name"); try { const auto result = segments_.emplace( @@ -165,17 +165,17 @@ void LightsControllerNode::LoadUserAnimations(const std::string & user_led_anima try { YAML::Node user_led_animations = YAML::LoadFile(user_led_animations_path); - auto user_animations = panther_utils::GetYAMLKeyValue>( + auto user_animations = husarion_ugv_utils::GetYAMLKeyValue>( user_led_animations, "user_animations"); for (auto & animation_description : user_animations) { try { - auto id = panther_utils::GetYAMLKeyValue(animation_description, "id"); + auto id = husarion_ugv_utils::GetYAMLKeyValue(animation_description, "id"); if (id < 20) { throw std::runtime_error("Animation ID must be greater than 19."); } - auto priority = panther_utils::GetYAMLKeyValue( + auto priority = husarion_ugv_utils::GetYAMLKeyValue( animation_description, "priority", LEDAnimation::kDefaultPriority); if (priority == 1) { throw std::runtime_error("User animation can not have priority 1."); @@ -199,13 +199,13 @@ void LightsControllerNode::LoadAnimation(const YAML::Node & animation_descriptio LEDAnimationDescription led_animation_desc; try { - led_animation_desc.id = panther_utils::GetYAMLKeyValue( + led_animation_desc.id = husarion_ugv_utils::GetYAMLKeyValue( animation_description, "id"); - led_animation_desc.name = panther_utils::GetYAMLKeyValue( + led_animation_desc.name = husarion_ugv_utils::GetYAMLKeyValue( animation_description, "name", "ANIMATION_" + std::to_string(led_animation_desc.id)); - led_animation_desc.priority = panther_utils::GetYAMLKeyValue( + led_animation_desc.priority = husarion_ugv_utils::GetYAMLKeyValue( animation_description, "priority", LEDAnimation::kDefaultPriority); - led_animation_desc.timeout = panther_utils::GetYAMLKeyValue( + led_animation_desc.timeout = husarion_ugv_utils::GetYAMLKeyValue( animation_description, "timeout", LEDAnimation::kDefaultTimeout); if ( @@ -215,14 +215,15 @@ void LightsControllerNode::LoadAnimation(const YAML::Node & animation_descriptio throw std::runtime_error("Invalid LED animation priority."); } - auto animations = panther_utils::GetYAMLKeyValue>( + auto animations = husarion_ugv_utils::GetYAMLKeyValue>( animation_description, "animations"); for (auto & animation : animations) { AnimationDescription animation_desc; - animation_desc.type = panther_utils::GetYAMLKeyValue(animation, "type"); - animation_desc.animation = panther_utils::GetYAMLKeyValue(animation, "animation"); + animation_desc.type = husarion_ugv_utils::GetYAMLKeyValue(animation, "type"); + animation_desc.animation = husarion_ugv_utils::GetYAMLKeyValue( + animation, "animation"); - auto segments_group = panther_utils::GetYAMLKeyValue(animation, "segments"); + auto segments_group = husarion_ugv_utils::GetYAMLKeyValue(animation, "segments"); animation_desc.segments = segments_map_.at(segments_group); led_animation_desc.animations.push_back(animation_desc); @@ -258,7 +259,7 @@ void LightsControllerNode::PublishPanelFrame(const std::size_t channel) const auto number_of_leds = panel->GetNumberOfLeds(); ImageMsg::UniquePtr image(new ImageMsg); - image->header.frame_id = panther_utils::ros::AddNamespaceToFrameID( + image->header.frame_id = husarion_ugv_utils::ros::AddNamespaceToFrameID( "lights_channel_" + std::to_string(channel) + "_link", std::string(this->get_namespace())); image->header.stamp = this->get_clock()->now(); image->encoding = "rgba8"; @@ -370,7 +371,7 @@ void LightsControllerNode::SetLEDAnimation(const std::shared_ptr & current_animation_ = std::move(led_animation); } -} // namespace panther_lights +} // namespace husarion_ugv_lights #include -RCLCPP_COMPONENTS_REGISTER_NODE(panther_lights::LightsControllerNode) +RCLCPP_COMPONENTS_REGISTER_NODE(husarion_ugv_lights::LightsControllerNode) diff --git a/panther_lights/src/lights_driver_node.cpp b/husarion_ugv_lights/src/lights_driver_node.cpp similarity index 97% rename from panther_lights/src/lights_driver_node.cpp rename to husarion_ugv_lights/src/lights_driver_node.cpp index 7535955c4..62e892366 100644 --- a/panther_lights/src/lights_driver_node.cpp +++ b/husarion_ugv_lights/src/lights_driver_node.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_lights/lights_driver_node.hpp" +#include "husarion_ugv_lights/lights_driver_node.hpp" #include #include @@ -31,9 +31,9 @@ #include "panther_msgs/srv/set_led_brightness.hpp" -#include "panther_lights/apa102.hpp" +#include "husarion_ugv_lights/apa102.hpp" -namespace panther_lights +namespace husarion_ugv_lights { using std::placeholders::_1; @@ -280,7 +280,7 @@ void LightsDriverNode::DiagnoseLights(diagnostic_updater::DiagnosticStatusWrappe status.summary(error_level, message); } -} // namespace panther_lights +} // namespace husarion_ugv_lights #include -RCLCPP_COMPONENTS_REGISTER_NODE(panther_lights::LightsDriverNode) +RCLCPP_COMPONENTS_REGISTER_NODE(husarion_ugv_lights::LightsDriverNode) diff --git a/panther_lights/test/files/animation.png b/husarion_ugv_lights/test/files/animation.png similarity index 100% rename from panther_lights/test/files/animation.png rename to husarion_ugv_lights/test/files/animation.png diff --git a/panther_lights/test/integration/panther_lights.test.py b/husarion_ugv_lights/test/integration/panther_lights.test.py similarity index 94% rename from panther_lights/test/integration/panther_lights.test.py rename to husarion_ugv_lights/test/integration/panther_lights.test.py index 25fa0e95c..a40efd041 100644 --- a/panther_lights/test/integration/panther_lights.test.py +++ b/husarion_ugv_lights/test/integration/panther_lights.test.py @@ -17,9 +17,9 @@ import unittest +import husarion_ugv_utils.integration_test_utils as test_utils import launch import launch_testing -import panther_utils.integration_test_utils as test_utils import rclpy import rclpy.qos from diagnostic_msgs.msg import DiagnosticArray @@ -38,17 +38,19 @@ def generate_test_description(): # TODO: Fix the path for specific robot model animations_config_path = ( - PathJoinSubstitution([FindPackageShare("panther_lights"), "config", "animations.yaml"]), + PathJoinSubstitution( + [FindPackageShare("husarion_ugv_lights"), "config", "animations.yaml"] + ), ) lights_controller_node = Node( - package="panther_lights", + package="husarion_ugv_lights", executable="lights_controller_node", parameters=[{"animations_config_path": animations_config_path}], ) lights_driver_node = Node( - package="panther_lights", + package="husarion_ugv_lights", executable="lights_driver_node", ) diff --git a/panther_lights/test/unit/animation/test_animation.cpp b/husarion_ugv_lights/test/unit/animation/test_animation.cpp similarity index 98% rename from panther_lights/test/unit/animation/test_animation.cpp rename to husarion_ugv_lights/test/unit/animation/test_animation.cpp index fb85d6a9a..11e1f1bb4 100644 --- a/panther_lights/test/unit/animation/test_animation.cpp +++ b/husarion_ugv_lights/test/unit/animation/test_animation.cpp @@ -20,9 +20,9 @@ #include "gtest/gtest.h" #include "yaml-cpp/yaml.h" -#include "panther_lights/animation/animation.hpp" +#include "husarion_ugv_lights/animation/animation.hpp" -class AnimationWrapper : public panther_lights::Animation +class AnimationWrapper : public husarion_ugv_lights::Animation { public: AnimationWrapper() {} diff --git a/panther_lights/test/unit/animation/test_charging_animation.cpp b/husarion_ugv_lights/test/unit/animation/test_charging_animation.cpp similarity index 97% rename from panther_lights/test/unit/animation/test_charging_animation.cpp rename to husarion_ugv_lights/test/unit/animation/test_charging_animation.cpp index 9a1c6d6a7..b95eff589 100644 --- a/panther_lights/test/unit/animation/test_charging_animation.cpp +++ b/husarion_ugv_lights/test/unit/animation/test_charging_animation.cpp @@ -21,9 +21,9 @@ #include "gtest/gtest.h" #include "yaml-cpp/yaml.h" -#include "panther_lights/animation/charging_animation.hpp" +#include "husarion_ugv_lights/animation/charging_animation.hpp" -class ChargingAnimationWrapper : public panther_lights::ChargingAnimation +class ChargingAnimationWrapper : public husarion_ugv_lights::ChargingAnimation { public: ChargingAnimationWrapper() {} diff --git a/panther_lights/test/unit/animation/test_image_animation.cpp b/husarion_ugv_lights/test/unit/animation/test_image_animation.cpp similarity index 94% rename from panther_lights/test/unit/animation/test_image_animation.cpp rename to husarion_ugv_lights/test/unit/animation/test_image_animation.cpp index 2409a30c3..5fdb993c4 100644 --- a/panther_lights/test/unit/animation/test_image_animation.cpp +++ b/husarion_ugv_lights/test/unit/animation/test_image_animation.cpp @@ -24,11 +24,11 @@ #include "gtest/gtest.h" #include "yaml-cpp/yaml.h" -#include "panther_lights/animation/image_animation.hpp" +#include "husarion_ugv_lights/animation/image_animation.hpp" namespace gil = boost::gil; -class ImageAnimationWrapper : public panther_lights::ImageAnimation +class ImageAnimationWrapper : public husarion_ugv_lights::ImageAnimation { public: ImageAnimationWrapper() {} @@ -98,17 +98,17 @@ TEST_F(TestImageAnimation, ParseImagePath) EXPECT_THROW(animation_->ParseImagePath(image_path), std::runtime_error); // invalid substitution - image_path = "$(fin panther_lights)/test/files/animation.png"; + image_path = "$(fin husarion_ugv_lights)/test/files/animation.png"; EXPECT_THROW(animation_->ParseImagePath(image_path), std::runtime_error); - image_path = "$(find panther_lights/test/files/animation.png"; + image_path = "$(find husarion_ugv_lights/test/files/animation.png"; EXPECT_THROW(animation_->ParseImagePath(image_path), std::runtime_error); // following ones may not work if ROS package is not build or sourced - image_path = "$(find panther_lights)/test/files/animation.png"; + image_path = "$(find husarion_ugv_lights)/test/files/animation.png"; EXPECT_NO_THROW(animation_->ParseImagePath(image_path)); // multiple spaces after find syntax - image_path = "$(find panther_lights)/test/files/animation.png"; + image_path = "$(find husarion_ugv_lights)/test/files/animation.png"; EXPECT_NO_THROW(animation_->ParseImagePath(image_path)); } diff --git a/panther_lights/test/unit/led_components/test_led_animation.cpp b/husarion_ugv_lights/test/unit/led_components/test_led_animation.cpp similarity index 79% rename from panther_lights/test/unit/led_components/test_led_animation.cpp rename to husarion_ugv_lights/test/unit/led_components/test_led_animation.cpp index 51dbc58d4..67173da0e 100644 --- a/panther_lights/test/unit/led_components/test_led_animation.cpp +++ b/husarion_ugv_lights/test/unit/led_components/test_led_animation.cpp @@ -22,8 +22,8 @@ #include "rclcpp/time.hpp" -#include "panther_lights/led_components/led_animations_queue.hpp" -#include "panther_lights/led_components/led_segment.hpp" +#include "husarion_ugv_lights/led_components/led_animations_queue.hpp" +#include "husarion_ugv_lights/led_components/led_segment.hpp" class TestLEDAnimation : public testing::Test { @@ -37,8 +37,8 @@ class TestLEDAnimation : public testing::Test static constexpr char kTestSegmentName1[] = "segment_1"; static constexpr char kTestSegmentName2[] = "segment_2"; - std::shared_ptr led_anim_; - std::unordered_map> segments_; + std::shared_ptr led_anim_; + std::unordered_map> segments_; }; TestLEDAnimation::TestLEDAnimation() @@ -46,24 +46,24 @@ TestLEDAnimation::TestLEDAnimation() auto segment_1_desc = YAML::Load("{channel: 1, led_range: 0-10}"); auto segment_2_desc = YAML::Load("{channel: 2, led_range: 0-10}"); segments_.emplace( - kTestSegmentName1, std::make_shared(segment_1_desc, 50.0)); + kTestSegmentName1, std::make_shared(segment_1_desc, 50.0)); segments_.emplace( - kTestSegmentName2, std::make_shared(segment_2_desc, 50.0)); + kTestSegmentName2, std::make_shared(segment_2_desc, 50.0)); - panther_lights::AnimationDescription anim_desc; + husarion_ugv_lights::AnimationDescription anim_desc; anim_desc.segments = {kTestSegmentName1, kTestSegmentName2}; - anim_desc.type = "panther_lights::ImageAnimation"; + anim_desc.type = "husarion_ugv_lights::ImageAnimation"; anim_desc.animation = - YAML::Load("{image: $(find panther_lights)/test/files/animation.png, duration: 2.0}"); + YAML::Load("{image: $(find husarion_ugv_lights)/test/files/animation.png, duration: 2.0}"); - panther_lights::LEDAnimationDescription led_anim_desc; + husarion_ugv_lights::LEDAnimationDescription led_anim_desc; led_anim_desc.id = 0; led_anim_desc.name = "TEST"; led_anim_desc.priority = 1; led_anim_desc.timeout = 10.0; led_anim_desc.animations = {anim_desc}; - led_anim_ = std::make_shared( + led_anim_ = std::make_shared( led_anim_desc, segments_, rclcpp::Time(0)); } @@ -80,16 +80,16 @@ void TestLEDAnimation::SetSegmentAnimations() TEST(TestLEDAnimationInitialization, InvalidSegmentName) { - std::unordered_map> segments; + std::unordered_map> segments; - panther_lights::AnimationDescription anim_desc; + husarion_ugv_lights::AnimationDescription anim_desc; anim_desc.segments = {"invalid_segment"}; - panther_lights::LEDAnimationDescription led_anim_desc; + husarion_ugv_lights::LEDAnimationDescription led_anim_desc; led_anim_desc.animations = {anim_desc}; EXPECT_THROW( - std::make_shared(led_anim_desc, segments, rclcpp::Time(0)), + std::make_shared(led_anim_desc, segments, rclcpp::Time(0)), std::runtime_error); } diff --git a/panther_lights/test/unit/led_components/test_led_animations_queue.cpp b/husarion_ugv_lights/test/unit/led_components/test_led_animations_queue.cpp similarity index 66% rename from panther_lights/test/unit/led_components/test_led_animations_queue.cpp rename to husarion_ugv_lights/test/unit/led_components/test_led_animations_queue.cpp index 4eb8d8c79..d7d8c04a4 100644 --- a/panther_lights/test/unit/led_components/test_led_animations_queue.cpp +++ b/husarion_ugv_lights/test/unit/led_components/test_led_animations_queue.cpp @@ -22,8 +22,8 @@ #include "rclcpp/time.hpp" -#include "panther_lights/led_components/led_animations_queue.hpp" -#include "panther_lights/led_components/led_segment.hpp" +#include "husarion_ugv_lights/led_components/led_animations_queue.hpp" +#include "husarion_ugv_lights/led_components/led_segment.hpp" class TestLEDAnimationsQueue : public testing::Test { @@ -31,13 +31,13 @@ class TestLEDAnimationsQueue : public testing::Test TestLEDAnimationsQueue(); ~TestLEDAnimationsQueue() {} - panther_lights::LEDAnimation CreateLEDAnimation( + husarion_ugv_lights::LEDAnimation CreateLEDAnimation( const std::string & name, const std::uint8_t priority, const rclcpp::Time & init_time = rclcpp::Time(0)); protected: - std::shared_ptr led_anim_queue_; - std::unordered_map> segments_; + std::shared_ptr led_anim_queue_; + std::unordered_map> segments_; const std::size_t max_queue_size_ = 5; }; @@ -47,35 +47,36 @@ TestLEDAnimationsQueue::TestLEDAnimationsQueue() auto segment_1_desc = YAML::Load("{channel: 1, led_range: 0-10}"); auto segment_2_desc = YAML::Load("{channel: 2, led_range: 0-10}"); segments_.emplace( - "segment_1", std::make_shared(segment_1_desc, 50.0)); + "segment_1", std::make_shared(segment_1_desc, 50.0)); segments_.emplace( - "segment_2", std::make_shared(segment_2_desc, 50.0)); + "segment_2", std::make_shared(segment_2_desc, 50.0)); - led_anim_queue_ = std::make_shared(5); + led_anim_queue_ = std::make_shared(5); } -panther_lights::LEDAnimation TestLEDAnimationsQueue::CreateLEDAnimation( +husarion_ugv_lights::LEDAnimation TestLEDAnimationsQueue::CreateLEDAnimation( const std::string & name, const std::uint8_t priority, const rclcpp::Time & init_time) { - panther_lights::AnimationDescription anim_desc; + husarion_ugv_lights::AnimationDescription anim_desc; anim_desc.segments = {"segment_1", "segment_2"}; - anim_desc.type = "panther_lights::ImageAnimation"; + anim_desc.type = "husarion_ugv_lights::ImageAnimation"; anim_desc.animation = - YAML::Load("{image: $(find panther_lights)/test/files/animation.png, duration: 2.0}"); + YAML::Load("{image: $(find husarion_ugv_lights)/test/files/animation.png, duration: 2.0}"); - panther_lights::LEDAnimationDescription led_anim_desc; + husarion_ugv_lights::LEDAnimationDescription led_anim_desc; led_anim_desc.id = 0; led_anim_desc.name = name; led_anim_desc.priority = priority; led_anim_desc.timeout = 10.0; led_anim_desc.animations = {anim_desc}; - return panther_lights::LEDAnimation(led_anim_desc, segments_, init_time); + return husarion_ugv_lights::LEDAnimation(led_anim_desc, segments_, init_time); } TEST_F(TestLEDAnimationsQueue, Put) { - auto led_anim = std::make_shared(CreateLEDAnimation("TEST", 1)); + auto led_anim = + std::make_shared(CreateLEDAnimation("TEST", 1)); led_anim_queue_->Put(led_anim, rclcpp::Time(0)); EXPECT_FALSE(led_anim_queue_->Empty()); @@ -84,7 +85,8 @@ TEST_F(TestLEDAnimationsQueue, Put) TEST_F(TestLEDAnimationsQueue, PutQueueOverloaded) { - auto led_anim = std::make_shared(CreateLEDAnimation("TEST", 1)); + auto led_anim = + std::make_shared(CreateLEDAnimation("TEST", 1)); for (std::size_t i = 0; i < max_queue_size_; i++) { led_anim_queue_->Put(led_anim, rclcpp::Time(0)); } @@ -95,11 +97,11 @@ TEST_F(TestLEDAnimationsQueue, PutQueueOverloaded) TEST_F(TestLEDAnimationsQueue, PutClearWhenPriorityEqualOne) { auto led_anim_pr_1 = - std::make_shared(CreateLEDAnimation("TEST", 1)); + std::make_shared(CreateLEDAnimation("TEST", 1)); auto led_anim_pr_2 = - std::make_shared(CreateLEDAnimation("TEST", 2)); + std::make_shared(CreateLEDAnimation("TEST", 2)); auto led_anim_pr_3 = - std::make_shared(CreateLEDAnimation("TEST", 3)); + std::make_shared(CreateLEDAnimation("TEST", 3)); led_anim_queue_->Put(led_anim_pr_3, rclcpp::Time(0)); led_anim_queue_->Put(led_anim_pr_2, rclcpp::Time(0)); @@ -113,9 +115,9 @@ TEST_F(TestLEDAnimationsQueue, PutClearWhenPriorityEqualOne) TEST_F(TestLEDAnimationsQueue, PutSortByPriority) { auto led_anim_pr_2 = - std::make_shared(CreateLEDAnimation("TEST", 2)); + std::make_shared(CreateLEDAnimation("TEST", 2)); auto led_anim_pr_3 = - std::make_shared(CreateLEDAnimation("TEST", 3)); + std::make_shared(CreateLEDAnimation("TEST", 3)); led_anim_queue_->Put(led_anim_pr_3, rclcpp::Time(0)); led_anim_queue_->Put(led_anim_pr_2, rclcpp::Time(0)); @@ -130,14 +132,14 @@ TEST_F(TestLEDAnimationsQueue, PutSortByPriority) TEST_F(TestLEDAnimationsQueue, PutSortByTime) { - auto led_anim_t0 = - std::make_shared(CreateLEDAnimation("TEST", 1, rclcpp::Time(0))); - auto led_anim_t1 = - std::make_shared(CreateLEDAnimation("TEST", 1, rclcpp::Time(1))); - auto led_anim_t2 = - std::make_shared(CreateLEDAnimation("TEST", 1, rclcpp::Time(2))); - auto led_anim_t3 = - std::make_shared(CreateLEDAnimation("TEST", 1, rclcpp::Time(3))); + auto led_anim_t0 = std::make_shared( + CreateLEDAnimation("TEST", 1, rclcpp::Time(0))); + auto led_anim_t1 = std::make_shared( + CreateLEDAnimation("TEST", 1, rclcpp::Time(1))); + auto led_anim_t2 = std::make_shared( + CreateLEDAnimation("TEST", 1, rclcpp::Time(2))); + auto led_anim_t3 = std::make_shared( + CreateLEDAnimation("TEST", 1, rclcpp::Time(3))); led_anim_queue_->Put(led_anim_t3, rclcpp::Time(4)); led_anim_queue_->Put(led_anim_t1, rclcpp::Time(4)); @@ -158,11 +160,11 @@ TEST_F(TestLEDAnimationsQueue, GetQueueEmpty) TEST_F(TestLEDAnimationsQueue, Clear) { auto led_anim_pr_1 = - std::make_shared(CreateLEDAnimation("TEST1", 1)); + std::make_shared(CreateLEDAnimation("TEST1", 1)); auto led_anim_pr_2 = - std::make_shared(CreateLEDAnimation("TEST2", 2)); + std::make_shared(CreateLEDAnimation("TEST2", 2)); auto led_anim_pr_3 = - std::make_shared(CreateLEDAnimation("TEST3", 3)); + std::make_shared(CreateLEDAnimation("TEST3", 3)); led_anim_queue_->Put(led_anim_pr_1, rclcpp::Time(0)); led_anim_queue_->Put(led_anim_pr_2, rclcpp::Time(0)); @@ -184,8 +186,8 @@ TEST_F(TestLEDAnimationsQueue, Clear) TEST_F(TestLEDAnimationsQueue, ValidateAnimationTimedOut) { - auto led_anim = - std::make_shared(CreateLEDAnimation("TEST", 1, rclcpp::Time(0))); + auto led_anim = std::make_shared( + CreateLEDAnimation("TEST", 1, rclcpp::Time(0))); led_anim_queue_->Put(led_anim, rclcpp::Time(0)); led_anim_queue_->Validate(rclcpp::Time(0)); @@ -200,11 +202,11 @@ TEST_F(TestLEDAnimationsQueue, ValidateAnimationTimedOut) TEST_F(TestLEDAnimationsQueue, GetFirstAnimationPriority) { auto led_anim_pr_1 = - std::make_shared(CreateLEDAnimation("TEST1", 1)); + std::make_shared(CreateLEDAnimation("TEST1", 1)); auto led_anim_pr_2 = - std::make_shared(CreateLEDAnimation("TEST2", 2)); + std::make_shared(CreateLEDAnimation("TEST2", 2)); auto led_anim_pr_3 = - std::make_shared(CreateLEDAnimation("TEST3", 3)); + std::make_shared(CreateLEDAnimation("TEST3", 3)); led_anim_queue_->Put(led_anim_pr_1, rclcpp::Time(0)); led_anim_queue_->Put(led_anim_pr_2, rclcpp::Time(0)); @@ -223,11 +225,11 @@ TEST_F(TestLEDAnimationsQueue, GetFirstAnimationPriority) TEST_F(TestLEDAnimationsQueue, Remove) { auto led_anim_pr_1 = - std::make_shared(CreateLEDAnimation("TEST1", 1)); + std::make_shared(CreateLEDAnimation("TEST1", 1)); auto led_anim_pr_2 = - std::make_shared(CreateLEDAnimation("TEST2", 2)); + std::make_shared(CreateLEDAnimation("TEST2", 2)); auto led_anim_pr_3 = - std::make_shared(CreateLEDAnimation("TEST3", 3)); + std::make_shared(CreateLEDAnimation("TEST3", 3)); led_anim_queue_->Put(led_anim_pr_1, rclcpp::Time(0)); led_anim_queue_->Put(led_anim_pr_2, rclcpp::Time(0)); diff --git a/panther_lights/test/unit/led_components/test_led_panel.cpp b/husarion_ugv_lights/test/unit/led_components/test_led_panel.cpp similarity index 93% rename from panther_lights/test/unit/led_components/test_led_panel.cpp rename to husarion_ugv_lights/test/unit/led_components/test_led_panel.cpp index 3b3c1aafb..7e0c90c37 100644 --- a/panther_lights/test/unit/led_components/test_led_panel.cpp +++ b/husarion_ugv_lights/test/unit/led_components/test_led_panel.cpp @@ -19,18 +19,18 @@ #include "gtest/gtest.h" -#include "panther_lights/led_components/led_panel.hpp" +#include "husarion_ugv_lights/led_components/led_panel.hpp" class TestLEDPanel : public testing::Test { public: - TestLEDPanel() { led_panel_ = std::make_unique(num_led_); } + TestLEDPanel() { led_panel_ = std::make_unique(num_led_); } ~TestLEDPanel() {} protected: void UpdateAndTestFrame( const std::size_t iterator_first, const std::vector & test_frame); - std::unique_ptr led_panel_; + std::unique_ptr led_panel_; const std::size_t num_led_ = 46; const std::size_t frame_size_ = num_led_ * 4; @@ -60,7 +60,7 @@ void TestLEDPanel::UpdateAndTestFrame( TEST(TestLEDPanelInitialization, FrameSize) { const std::size_t num_led = 22; - auto led_panel = panther_lights::LEDPanel(num_led); + auto led_panel = husarion_ugv_lights::LEDPanel(num_led); EXPECT_EQ(num_led * 4, led_panel.GetFrame().size()); } diff --git a/panther_lights/test/unit/led_components/test_led_segment.cpp b/husarion_ugv_lights/test/unit/led_components/test_led_segment.cpp similarity index 57% rename from panther_lights/test/unit/led_components/test_led_segment.cpp rename to husarion_ugv_lights/test/unit/led_components/test_led_segment.cpp index 82fbec3e2..9423f2fd7 100644 --- a/panther_lights/test/unit/led_components/test_led_segment.cpp +++ b/husarion_ugv_lights/test/unit/led_components/test_led_segment.cpp @@ -21,10 +21,10 @@ #include "gtest/gtest.h" #include "yaml-cpp/yaml.h" -#include "panther_lights/led_components/led_segment.hpp" -#include "panther_utils/test/test_utils.hpp" +#include "husarion_ugv_lights/led_components/led_segment.hpp" +#include "husarion_ugv_utils/test/test_utils.hpp" -class LEDSegmentWrapper : public panther_lights::LEDSegment +class LEDSegmentWrapper : public husarion_ugv_lights::LEDSegment { public: LEDSegmentWrapper(const YAML::Node & segment_description, const float controller_frequency) @@ -32,8 +32,8 @@ class LEDSegmentWrapper : public panther_lights::LEDSegment { } - std::shared_ptr GetAnimation() const { return animation_; } - std::shared_ptr GetDefaultAnimation() const + std::shared_ptr GetAnimation() const { return animation_; } + std::shared_ptr GetDefaultAnimation() const { return default_animation_; } @@ -67,121 +67,128 @@ YAML::Node CreateSegmentDescription(const std::string & led_range, const std::st TEST(TestLEDSegmentInitialization, DescriptionMissingRequiredKey) { auto segment_desc = YAML::Load(""); - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( - [segment_desc]() { panther_lights::LEDSegment(segment_desc, 10.0); }, + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( + [segment_desc]() { husarion_ugv_lights::LEDSegment(segment_desc, 10.0); }, "Missing 'channel' in description")); segment_desc = YAML::Load("channel: 0"); - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( - [segment_desc]() { panther_lights::LEDSegment(segment_desc, 10.0); }, + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( + [segment_desc]() { husarion_ugv_lights::LEDSegment(segment_desc, 10.0); }, "Missing 'led_range' in description")); } TEST(TestLEDSegmentInitialization, InvalidChannelExpression) { auto segment_desc = CreateSegmentDescription("0-10", "s1"); - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( - [segment_desc]() { panther_lights::LEDSegment(segment_desc, 10.0); }, + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( + [segment_desc]() { husarion_ugv_lights::LEDSegment(segment_desc, 10.0); }, "Failed to convert 'channel' key")); segment_desc["channel"] = "-1"; - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( - [segment_desc]() { panther_lights::LEDSegment(segment_desc, 10.0); }, + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( + [segment_desc]() { husarion_ugv_lights::LEDSegment(segment_desc, 10.0); }, "Failed to convert 'channel' key")); } TEST(TestLEDSegmentInitialization, InvalidLedRangeExpression) { auto segment_desc = CreateSegmentDescription("010", "1"); - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( - [segment_desc]() { panther_lights::LEDSegment(segment_desc, 10.0); }, + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( + [segment_desc]() { husarion_ugv_lights::LEDSegment(segment_desc, 10.0); }, "No '-' character found in the led_range expression")); segment_desc["led_range"] = "s0-10"; - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( - [segment_desc]() { panther_lights::LEDSegment(segment_desc, 10.0); }, + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( + [segment_desc]() { husarion_ugv_lights::LEDSegment(segment_desc, 10.0); }, "Error converting string to integer")); segment_desc["led_range"] = "0-p10"; - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( - [segment_desc]() { panther_lights::LEDSegment(segment_desc, 10.0); }, + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( + [segment_desc]() { husarion_ugv_lights::LEDSegment(segment_desc, 10.0); }, "Error converting string to integer")); } TEST(TestLEDSegmentInitialization, ValidDescription) { const auto segment_desc = CreateSegmentDescription("0-10", "1"); - EXPECT_NO_THROW(panther_lights::LEDSegment(segment_desc, 10.0)); + EXPECT_NO_THROW(husarion_ugv_lights::LEDSegment(segment_desc, 10.0)); } TEST(TestLEDSegmentInitialization, FirstLedPosition) { auto segment_desc = CreateSegmentDescription("0-10", "1"); - std::shared_ptr led_segment; + std::shared_ptr led_segment; - ASSERT_NO_THROW(led_segment = std::make_shared(segment_desc, 10.0)); + ASSERT_NO_THROW( + led_segment = std::make_shared(segment_desc, 10.0)); EXPECT_EQ(std::size_t(0), led_segment->GetFirstLEDPosition()); segment_desc["led_range"] = "5-11"; led_segment.reset(); - ASSERT_NO_THROW(led_segment = std::make_shared(segment_desc, 10.0)); + ASSERT_NO_THROW( + led_segment = std::make_shared(segment_desc, 10.0)); EXPECT_EQ(std::size_t(5 * 4), led_segment->GetFirstLEDPosition()); segment_desc["led_range"] = "10-10"; led_segment.reset(); - ASSERT_NO_THROW(led_segment = std::make_shared(segment_desc, 10.0)); + ASSERT_NO_THROW( + led_segment = std::make_shared(segment_desc, 10.0)); EXPECT_EQ(std::size_t(10 * 4), led_segment->GetFirstLEDPosition()); segment_desc["led_range"] = "13-5"; led_segment.reset(); - ASSERT_NO_THROW(led_segment = std::make_shared(segment_desc, 10.0)); + ASSERT_NO_THROW( + led_segment = std::make_shared(segment_desc, 10.0)); EXPECT_EQ(std::size_t(5 * 4), led_segment->GetFirstLEDPosition()); segment_desc["led_range"] = "17-0"; led_segment.reset(); - ASSERT_NO_THROW(led_segment = std::make_shared(segment_desc, 10.0)); + ASSERT_NO_THROW( + led_segment = std::make_shared(segment_desc, 10.0)); EXPECT_EQ(std::size_t(0), led_segment->GetFirstLEDPosition()); } TEST_F(TestLEDSegment, GetAnimationFrameNoAnimation) { - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( [&]() { led_segment_->GetAnimationFrame(); }, "Segment animation not defined")); } TEST_F(TestLEDSegment, GetAnimationProgressNoAnimation) { - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( [&]() { led_segment_->GetAnimationProgress(); }, "Segment animation not defined")); } TEST_F(TestLEDSegment, ResetAnimationNoAnimation) { - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( [&]() { led_segment_->ResetAnimation(); }, "Segment animation not defined")); } TEST_F(TestLEDSegment, GetAnimationBrightnessNoAnimation) { - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( [&]() { led_segment_->GetAnimationBrightness(); }, "Segment animation not defined")); } TEST_F(TestLEDSegment, SetAnimationInvalidType) { const YAML::Node animation_desc; - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( [&]() { - led_segment_->SetAnimation("panther_lights::WrongAnimationType}", animation_desc, false); + led_segment_->SetAnimation("husarion_ugv_lights::WrongAnimationType}", animation_desc, false); }, "The plugin failed to load. Error: ")); } TEST_F(TestLEDSegment, SetAnimationFailAnimationInitialization) { - const auto animation_desc = YAML::Load("{type: panther_lights::ImageAnimation}"); - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( - [&]() { led_segment_->SetAnimation("panther_lights::ImageAnimation", animation_desc, false); }, + const auto animation_desc = YAML::Load("{type: husarion_ugv_lights::ImageAnimation}"); + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( + [&]() { + led_segment_->SetAnimation("husarion_ugv_lights::ImageAnimation", animation_desc, false); + }, "Failed to initialize animation: ")); } @@ -189,27 +196,29 @@ TEST_F(TestLEDSegment, SetAnimation) { // test each known animtion type const auto image_anim_desc = YAML::Load( - "{image: $(find panther_lights)/test/files/animation.png, " + "{image: $(find husarion_ugv_lights)/test/files/animation.png, " "duration: 2}"); const auto charging_anim_desc = YAML::Load("{duration: 2}"); EXPECT_NO_THROW( - led_segment_->SetAnimation("panther_lights::ImageAnimation", image_anim_desc, false)); + led_segment_->SetAnimation("husarion_ugv_lights::ImageAnimation", image_anim_desc, false)); EXPECT_NO_THROW(led_segment_->SetAnimation( - "panther_lights::ChargingAnimation", charging_anim_desc, false, "0.5")); + "husarion_ugv_lights::ChargingAnimation", charging_anim_desc, false, "0.5")); } TEST_F(TestLEDSegment, SetAnimationRepeating) { const auto anim_desc = YAML::Load( - "{image: $(find panther_lights)/test/files/animation.png, " + "{image: $(find husarion_ugv_lights)/test/files/animation.png, " "duration: 2}"); - ASSERT_NO_THROW(led_segment_->SetAnimation("panther_lights::ImageAnimation", anim_desc, false)); + ASSERT_NO_THROW( + led_segment_->SetAnimation("husarion_ugv_lights::ImageAnimation", anim_desc, false)); EXPECT_TRUE(led_segment_->GetDefaultAnimation().get() == nullptr); - ASSERT_NO_THROW(led_segment_->SetAnimation("panther_lights::ImageAnimation", anim_desc, true)); + ASSERT_NO_THROW( + led_segment_->SetAnimation("husarion_ugv_lights::ImageAnimation", anim_desc, true)); EXPECT_TRUE(led_segment_->GetDefaultAnimation().get() != nullptr); EXPECT_TRUE(led_segment_->IsAnimationFinished()); @@ -217,16 +226,17 @@ TEST_F(TestLEDSegment, SetAnimationRepeating) TEST_F(TestLEDSegment, UpdateAnimationAnimationNotSet) { - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( [&]() { led_segment_->UpdateAnimation(); }, "Segment animation not defined")); } TEST_F(TestLEDSegment, UpdateAnimation) { const auto anim_desc = YAML::Load( - "{image: $(find panther_lights)/test/files/animation.png, " + "{image: $(find husarion_ugv_lights)/test/files/animation.png, " "duration: 2}"); - ASSERT_NO_THROW(led_segment_->SetAnimation("panther_lights::ImageAnimation", anim_desc, false)); + ASSERT_NO_THROW( + led_segment_->SetAnimation("husarion_ugv_lights::ImageAnimation", anim_desc, false)); EXPECT_NO_THROW(led_segment_->UpdateAnimation()); EXPECT_EQ(segment_led_num_ * 4, led_segment_->GetAnimationFrame().size()); } @@ -240,9 +250,10 @@ int main(int argc, char ** argv) TEST_F(TestLEDSegment, ResetDefaultAnimationWhenNewArrive) { const auto anim_desc = YAML::Load( - "{image: $(find panther_lights)/test/files/animation.png, " + "{image: $(find husarion_ugv_lights)/test/files/animation.png, " "duration: 2}"); - ASSERT_NO_THROW(led_segment_->SetAnimation("panther_lights::ImageAnimation", anim_desc, true)); + ASSERT_NO_THROW( + led_segment_->SetAnimation("husarion_ugv_lights::ImageAnimation", anim_desc, true)); auto default_anim = led_segment_->GetDefaultAnimation(); while (!default_anim->IsFinished()) { @@ -250,7 +261,8 @@ TEST_F(TestLEDSegment, ResetDefaultAnimationWhenNewArrive) } // add new animation, and check if default animation was reset - ASSERT_NO_THROW(led_segment_->SetAnimation("panther_lights::ImageAnimation", anim_desc, false)); + ASSERT_NO_THROW( + led_segment_->SetAnimation("husarion_ugv_lights::ImageAnimation", anim_desc, false)); EXPECT_FALSE(default_anim->IsFinished()); } diff --git a/panther_lights/test/unit/led_components/test_segment_converter.cpp b/husarion_ugv_lights/test/unit/led_components/test_segment_converter.cpp similarity index 69% rename from panther_lights/test/unit/led_components/test_segment_converter.cpp rename to husarion_ugv_lights/test/unit/led_components/test_segment_converter.cpp index 807f9440d..53928704f 100644 --- a/panther_lights/test/unit/led_components/test_segment_converter.cpp +++ b/husarion_ugv_lights/test/unit/led_components/test_segment_converter.cpp @@ -22,20 +22,20 @@ #include "gtest/gtest.h" #include "yaml-cpp/yaml.h" -#include "panther_lights/led_components/led_panel.hpp" -#include "panther_lights/led_components/led_segment.hpp" -#include "panther_lights/led_components/segment_converter.hpp" +#include "husarion_ugv_lights/led_components/led_panel.hpp" +#include "husarion_ugv_lights/led_components/led_segment.hpp" +#include "husarion_ugv_lights/led_components/segment_converter.hpp" class TestSegmentConverter : public testing::Test { public: TestSegmentConverter() { - segment_converter_ = std::make_unique(); + segment_converter_ = std::make_unique(); // create 2 basic panels with different number of leds - led_panels_.insert({1, std::make_unique(panel_1_num_led_)}); - led_panels_.insert({2, std::make_unique(panel_2_num_led_)}); + led_panels_.insert({1, std::make_unique(panel_1_num_led_)}); + led_panels_.insert({2, std::make_unique(panel_2_num_led_)}); } ~TestSegmentConverter() {} @@ -47,9 +47,9 @@ class TestSegmentConverter : public testing::Test std::size_t panel_1_num_led_ = 20; std::size_t panel_2_num_led_ = 30; - std::unique_ptr segment_converter_; - std::unordered_map> segments_; - std::unordered_map> led_panels_; + std::unique_ptr segment_converter_; + std::unordered_map> segments_; + std::unordered_map> led_panels_; }; YAML::Node TestSegmentConverter::CreateSegmentDescription( @@ -63,17 +63,17 @@ YAML::Node TestSegmentConverter::CreateSegmentDescription( YAML::Node TestSegmentConverter::CreateImageAnimationDescription() { - return YAML::Load("{image: $(find panther_lights)/test/files/animation.png, duration: 2}"); + return YAML::Load("{image: $(find husarion_ugv_lights)/test/files/animation.png, duration: 2}"); } TEST_F(TestSegmentConverter, ConvertInvalidChannel) { segments_.emplace( "name", - std::make_shared(CreateSegmentDescription(0, 10, 123), 50.0)); + std::make_shared(CreateSegmentDescription(0, 10, 123), 50.0)); const auto anim_desc = CreateImageAnimationDescription(); ASSERT_NO_THROW( - segments_.at("name")->SetAnimation("panther_lights::ImageAnimation", anim_desc, false)); + segments_.at("name")->SetAnimation("husarion_ugv_lights::ImageAnimation", anim_desc, false)); EXPECT_THROW(segment_converter_->Convert(segments_, led_panels_), std::out_of_range); } @@ -81,11 +81,11 @@ TEST_F(TestSegmentConverter, ConvertInvalidChannel) TEST_F(TestSegmentConverter, ConvertInvalidLedRange) { segments_.emplace( - "name", std::make_shared( + "name", std::make_shared( CreateSegmentDescription(panel_1_num_led_, panel_1_num_led_ + 1, 1), 50.0)); const auto anim_desc = CreateImageAnimationDescription(); ASSERT_NO_THROW( - segments_.at("name")->SetAnimation("panther_lights::ImageAnimation", anim_desc, false)); + segments_.at("name")->SetAnimation("husarion_ugv_lights::ImageAnimation", anim_desc, false)); EXPECT_THROW(segment_converter_->Convert(segments_, led_panels_), std::runtime_error); } @@ -93,17 +93,17 @@ TEST_F(TestSegmentConverter, ConvertInvalidLedRange) TEST_F(TestSegmentConverter, ConvertSingleSegmentForEachPanel) { segments_.emplace( - "name_1", std::make_shared( + "name_1", std::make_shared( CreateSegmentDescription(0, panel_1_num_led_ - 1, 1), 50.0)); segments_.emplace( - "name_2", std::make_shared( + "name_2", std::make_shared( CreateSegmentDescription(0, panel_2_num_led_ - 1, 2), 50.0)); const auto anim_desc = CreateImageAnimationDescription(); for (auto & segment : segments_) { ASSERT_NO_THROW( - segment.second->SetAnimation("panther_lights::ImageAnimation", anim_desc, false)); + segment.second->SetAnimation("husarion_ugv_lights::ImageAnimation", anim_desc, false)); ASSERT_NO_THROW(segment.second->UpdateAnimation()); } @@ -113,28 +113,28 @@ TEST_F(TestSegmentConverter, ConvertSingleSegmentForEachPanel) TEST_F(TestSegmentConverter, ConvertMultipleSegments) { segments_.emplace( - "name_1", std::make_shared( + "name_1", std::make_shared( CreateSegmentDescription(0, std::size_t(panel_1_num_led_ / 2) - 1, 1), 50.0)); segments_.emplace( "name_2", - std::make_shared( + std::make_shared( CreateSegmentDescription(std::size_t(panel_1_num_led_ / 2), panel_1_num_led_ - 1, 1), 50.0)); segments_.emplace( - "name_3", std::make_shared( + "name_3", std::make_shared( CreateSegmentDescription(0, (panel_2_num_led_ / 4) - 1, 2), 50.0)); segments_.emplace( "name_4", - std::make_shared( + std::make_shared( CreateSegmentDescription((panel_2_num_led_ / 4), (panel_2_num_led_ / 2) - 1, 2), 50.0)); segments_.emplace( - "name_5", std::make_shared( + "name_5", std::make_shared( CreateSegmentDescription((panel_2_num_led_ / 2), panel_2_num_led_ - 1, 2), 50.0)); const auto anim_desc = CreateImageAnimationDescription(); for (auto & segment : segments_) { ASSERT_NO_THROW( - segment.second->SetAnimation("panther_lights::ImageAnimation", anim_desc, false)); + segment.second->SetAnimation("husarion_ugv_lights::ImageAnimation", anim_desc, false)); ASSERT_NO_THROW(segment.second->UpdateAnimation()); } @@ -150,11 +150,11 @@ TEST_F(TestSegmentConverter, ConvertBrightnessOverride) anim_desc["brightness"] = float_brightness; segments_.emplace( - "name", std::make_shared( + "name", std::make_shared( CreateSegmentDescription(0, panel_1_num_led_ - 1, channel), 50.0)); ASSERT_NO_THROW( - segments_.at("name")->SetAnimation("panther_lights::ImageAnimation", anim_desc, false)); + segments_.at("name")->SetAnimation("husarion_ugv_lights::ImageAnimation", anim_desc, false)); segment_converter_->Convert(segments_, led_panels_); ASSERT_NO_THROW(segment_converter_->Convert(segments_, led_panels_)); @@ -169,10 +169,10 @@ TEST_F(TestSegmentConverter, ConvertBrightnessOverride) TEST_F(TestSegmentConverter, ConvertNoThrowIfAnimationNotSet) { segments_.emplace( - "name_1", std::make_shared( + "name_1", std::make_shared( CreateSegmentDescription(0, panel_1_num_led_ - 1, 1), 50.0)); segments_.emplace( - "name_2", std::make_shared( + "name_2", std::make_shared( CreateSegmentDescription(0, panel_2_num_led_ - 1, 2), 50.0)); EXPECT_NO_THROW(segment_converter_->Convert(segments_, led_panels_)); diff --git a/panther_lights/test/unit/test_apa102.cpp b/husarion_ugv_lights/test/unit/test_apa102.cpp similarity index 97% rename from panther_lights/test/unit/test_apa102.cpp rename to husarion_ugv_lights/test/unit/test_apa102.cpp index 2f5bbd2f8..2d43684c2 100644 --- a/panther_lights/test/unit/test_apa102.cpp +++ b/husarion_ugv_lights/test/unit/test_apa102.cpp @@ -15,13 +15,13 @@ #include #include -#include "panther_lights/apa102.hpp" +#include "husarion_ugv_lights/apa102.hpp" static constexpr char kMockDeviceName[] = "/dev/mocked_device"; static constexpr int kStartFrame = 0x00; static constexpr int kEndFrame = 0xFF; -class MockSPIDevice : public panther_lights::SPIDeviceInterface +class MockSPIDevice : public husarion_ugv_lights::SPIDeviceInterface { public: MOCK_METHOD(int, Open, (const std::string & device), (override)); @@ -32,7 +32,7 @@ class MockSPIDevice : public panther_lights::SPIDeviceInterface using NiceMock = testing::NiceMock; }; -class APA102Wrapper : public panther_lights::APA102 +class APA102Wrapper : public husarion_ugv_lights::APA102 { public: APA102Wrapper(std::shared_ptr spi_device, const std::string & device_name) diff --git a/panther_lights/test/unit/test_lights_controller_node.cpp b/husarion_ugv_lights/test/unit/test_lights_controller_node.cpp similarity index 87% rename from panther_lights/test/unit/test_lights_controller_node.cpp rename to husarion_ugv_lights/test/unit/test_lights_controller_node.cpp index 99b0a0690..07546ac43 100644 --- a/panther_lights/test/unit/test_lights_controller_node.cpp +++ b/husarion_ugv_lights/test/unit/test_lights_controller_node.cpp @@ -26,10 +26,10 @@ #include "rclcpp/rclcpp.hpp" -#include "panther_lights/lights_controller_node.hpp" -#include "panther_utils/test/test_utils.hpp" +#include "husarion_ugv_lights/lights_controller_node.hpp" +#include "husarion_ugv_utils/test/test_utils.hpp" -class ControllerNodeWrapper : public panther_lights::LightsControllerNode +class ControllerNodeWrapper : public husarion_ugv_lights::LightsControllerNode { public: ControllerNodeWrapper(const rclcpp::NodeOptions & options) : LightsControllerNode(options) {} @@ -55,9 +55,12 @@ class ControllerNodeWrapper : public panther_lights::LightsControllerNode return LightsControllerNode::AddAnimationToQueue(animation_id, repeating, param); } - std::shared_ptr GetQueue() { return this->animations_queue_; } + std::shared_ptr GetQueue() + { + return this->animations_queue_; + } - std::shared_ptr GetCurrentAnimation() + std::shared_ptr GetCurrentAnimation() { return this->current_animation_; } @@ -116,11 +119,11 @@ void TestLightsControllerNode::CreateLEDConfig(const std::filesystem::path file_ segments_map["test"] = std::vector(1, kTestSegmentName); YAML::Node animation; - animation["image"] = "$(find panther_lights)/test/files/strip01_red.png"; + animation["image"] = "$(find husarion_ugv_lights)/test/files/strip01_red.png"; animation["duration"] = 2; YAML::Node animation_desc; - animation_desc["type"] = "panther_lights::ImageAnimation"; + animation_desc["type"] = "husarion_ugv_lights::ImageAnimation"; animation_desc["segments"] = "test"; animation_desc["animation"] = animation; @@ -171,7 +174,7 @@ TEST_F(TestLightsControllerNode, InitializeLEDPanelsThrowRepeatingChannel) YAML::Node panels_desc; panels_desc["panels"] = panels; - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( [&]() { lights_controller_node_->InitializeLEDPanels(panels_desc["panels"]); }, "Multiple panels with channel nr")); } @@ -195,7 +198,7 @@ TEST_F(TestLightsControllerNode, InitializeLEDSegmentsThrowRepeatingName) YAML::Node segments_desc; segments_desc["segments"] = segments; - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( [&]() { lights_controller_node_->InitializeLEDSegments(segments_desc["segments"], 50.0); }, "Multiple segments with given name found")); } @@ -206,13 +209,13 @@ TEST_F(TestLightsControllerNode, LoadAnimationInvalidPriority) led_animation_desc["id"] = 11; led_animation_desc["priority"] = 0; - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( [&]() { lights_controller_node_->LoadAnimation(led_animation_desc); }, "Invalid LED animation priority")); led_animation_desc["priority"] = 4; - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( [&]() { lights_controller_node_->LoadAnimation(led_animation_desc); }, "Invalid LED animation priority")); } @@ -225,14 +228,14 @@ TEST_F(TestLightsControllerNode, LoadAnimationThrowRepeatingID) ASSERT_NO_THROW(lights_controller_node_->LoadAnimation(led_animation_desc)); - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( [&]() { lights_controller_node_->LoadAnimation(led_animation_desc); }, "Animation with given ID already exists")); } TEST_F(TestLightsControllerNode, AddAnimationToQueueThrowBadAnimationID) { - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( [&]() { lights_controller_node_->AddAnimationToQueue(99, false); }, "No animation with ID:")); } diff --git a/panther_lights/test/unit/test_lights_driver_node.cpp b/husarion_ugv_lights/test/unit/test_lights_driver_node.cpp similarity index 95% rename from panther_lights/test/unit/test_lights_driver_node.cpp rename to husarion_ugv_lights/test/unit/test_lights_driver_node.cpp index 09918acfd..91fcc0c12 100644 --- a/panther_lights/test/unit/test_lights_driver_node.cpp +++ b/husarion_ugv_lights/test/unit/test_lights_driver_node.cpp @@ -25,15 +25,15 @@ #include "panther_msgs/srv/set_led_brightness.hpp" -#include "panther_lights/apa102.hpp" -#include "panther_lights/lights_driver_node.hpp" -#include "panther_utils/test/ros_test_utils.hpp" +#include "husarion_ugv_lights/apa102.hpp" +#include "husarion_ugv_lights/lights_driver_node.hpp" +#include "husarion_ugv_utils/test/ros_test_utils.hpp" using ImageMsg = sensor_msgs::msg::Image; using SetBoolSrv = std_srvs::srv::SetBool; using SetLEDBrightnessSrv = panther_msgs::srv::SetLEDBrightness; -class MockAPA102 : public panther_lights::APA102Interface +class MockAPA102 : public husarion_ugv_lights::APA102Interface { public: MOCK_METHOD(void, SetGlobalBrightness, (const std::uint8_t brightness), (override)); @@ -44,7 +44,7 @@ class MockAPA102 : public panther_lights::APA102Interface }; // LightsDriverNode constructor implemented for testing purposes -panther_lights::LightsDriverNode::LightsDriverNode( +husarion_ugv_lights::LightsDriverNode::LightsDriverNode( APA102Interface::SharedPtr channel_1, APA102Interface::SharedPtr channel_2, const rclcpp::NodeOptions & options) : Node("lights_driver", options), @@ -60,7 +60,7 @@ panther_lights::LightsDriverNode::LightsDriverNode( frame_timeout_ = 0.1; }; -class DriverNodeWrapper : public panther_lights::LightsDriverNode +class DriverNodeWrapper : public husarion_ugv_lights::LightsDriverNode { public: DriverNodeWrapper( @@ -78,7 +78,7 @@ class DriverNodeWrapper : public panther_lights::LightsDriverNode } void FrameCB( - const ImageMsg::UniquePtr & msg, const panther_lights::APA102Interface::SharedPtr & panel, + const ImageMsg::UniquePtr & msg, const husarion_ugv_lights::APA102Interface::SharedPtr & panel, const rclcpp::Time & last_time, const std::string & panel_name) { return LightsDriverNode::FrameCB(msg, panel, last_time, panel_name); diff --git a/panther_localization/CHANGELOG.rst b/husarion_ugv_localization/CHANGELOG.rst similarity index 100% rename from panther_localization/CHANGELOG.rst rename to husarion_ugv_localization/CHANGELOG.rst diff --git a/panther_controller/CMakeLists.txt b/husarion_ugv_localization/CMakeLists.txt similarity index 82% rename from panther_controller/CMakeLists.txt rename to husarion_ugv_localization/CMakeLists.txt index c6489681f..2ce65ec9f 100644 --- a/panther_controller/CMakeLists.txt +++ b/husarion_ugv_localization/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.10.2) -project(panther_controller) +project(husarion_ugv_localization) find_package(ament_cmake REQUIRED) diff --git a/panther_localization/README.md b/husarion_ugv_localization/README.md similarity index 98% rename from panther_localization/README.md rename to husarion_ugv_localization/README.md index 416af8978..c89705ea9 100644 --- a/panther_localization/README.md +++ b/husarion_ugv_localization/README.md @@ -1,4 +1,4 @@ -# panther_localization +# husarion_ugv_localization The package is responsible for activating mods responsible for fusion of data related to the robot's location. diff --git a/panther_localization/config/enu_localization.yaml b/husarion_ugv_localization/config/enu_localization.yaml similarity index 99% rename from panther_localization/config/enu_localization.yaml rename to husarion_ugv_localization/config/enu_localization.yaml index afaee4e24..6b2668cc7 100644 --- a/panther_localization/config/enu_localization.yaml +++ b/husarion_ugv_localization/config/enu_localization.yaml @@ -41,7 +41,7 @@ use_control: true control_timeout: 0.5 control_config: [true, true, false, false, false, true] - acceleration_limits: [2.7, 1.5, 0.0, 0.0, 0.0, 5.7] # Values taken from WH01_controller.yaml and WH02_controller.yaml inside panther_controller/config + acceleration_limits: [2.7, 1.5, 0.0, 0.0, 0.0, 5.7] # Values taken from WH01_controller.yaml and WH02_controller.yaml inside husarion_ugv_controller/config predict_to_current_time: true diff --git a/panther_localization/config/enu_localization_with_gps.yaml b/husarion_ugv_localization/config/enu_localization_with_gps.yaml similarity index 99% rename from panther_localization/config/enu_localization_with_gps.yaml rename to husarion_ugv_localization/config/enu_localization_with_gps.yaml index 96c603204..ef1fa6ff6 100644 --- a/panther_localization/config/enu_localization_with_gps.yaml +++ b/husarion_ugv_localization/config/enu_localization_with_gps.yaml @@ -51,7 +51,7 @@ use_control: true control_timeout: 0.5 control_config: [true, true, false, false, false, true] - acceleration_limits: [2.7, 1.5, 0.0, 0.0, 0.0, 5.7] # Values taken from WH01_controller.yaml and WH02_controller.yaml inside panther_controller/config + acceleration_limits: [2.7, 1.5, 0.0, 0.0, 0.0, 5.7] # Values taken from WH01_controller.yaml and WH02_controller.yaml inside husarion_ugv_controller/config predict_to_current_time: true diff --git a/panther_localization/config/nmea_navsat_params.yaml b/husarion_ugv_localization/config/nmea_navsat_params.yaml similarity index 100% rename from panther_localization/config/nmea_navsat_params.yaml rename to husarion_ugv_localization/config/nmea_navsat_params.yaml diff --git a/panther_localization/config/relative_localization.yaml b/husarion_ugv_localization/config/relative_localization.yaml similarity index 99% rename from panther_localization/config/relative_localization.yaml rename to husarion_ugv_localization/config/relative_localization.yaml index 3e29fcdd7..5f420735b 100644 --- a/panther_localization/config/relative_localization.yaml +++ b/husarion_ugv_localization/config/relative_localization.yaml @@ -41,7 +41,7 @@ use_control: true control_timeout: 0.5 control_config: [true, true, false, false, false, true] - acceleration_limits: [2.7, 1.5, 0.0, 0.0, 0.0, 5.7] # Values taken from WH01_controller.yaml and WH02_controller.yaml inside panther_controller/config + acceleration_limits: [2.7, 1.5, 0.0, 0.0, 0.0, 5.7] # Values taken from WH01_controller.yaml and WH02_controller.yaml inside husarion_ugv_controller/config predict_to_current_time: true diff --git a/panther_localization/config/relative_localization_with_gps.yaml b/husarion_ugv_localization/config/relative_localization_with_gps.yaml similarity index 99% rename from panther_localization/config/relative_localization_with_gps.yaml rename to husarion_ugv_localization/config/relative_localization_with_gps.yaml index 0a98abcb5..fa8426758 100644 --- a/panther_localization/config/relative_localization_with_gps.yaml +++ b/husarion_ugv_localization/config/relative_localization_with_gps.yaml @@ -51,7 +51,7 @@ use_control: true control_timeout: 0.5 control_config: [true, true, false, false, false, true] - acceleration_limits: [2.7, 1.5, 0.0, 0.0, 0.0, 5.7] # Values taken from WH01_controller.yaml and WH02_controller.yaml inside panther_controller/config + acceleration_limits: [2.7, 1.5, 0.0, 0.0, 0.0, 5.7] # Values taken from WH01_controller.yaml and WH02_controller.yaml inside husarion_ugv_controller/config predict_to_current_time: true diff --git a/panther_localization/launch/localization.launch.py b/husarion_ugv_localization/launch/localization.launch.py similarity index 96% rename from panther_localization/launch/localization.launch.py rename to husarion_ugv_localization/launch/localization.launch.py index 2645a6b48..209aa7028 100644 --- a/panther_localization/launch/localization.launch.py +++ b/husarion_ugv_localization/launch/localization.launch.py @@ -82,7 +82,7 @@ def generate_launch_description(): declare_localization_config_path_arg = DeclareLaunchArgument( "localization_config_path", default_value=PathJoinSubstitution( - [FindPackageShare("panther_localization"), "config", localization_config_filename] + [FindPackageShare("husarion_ugv_localization"), "config", localization_config_filename] ), description="Specify the path to the localization configuration file.", ) @@ -104,7 +104,7 @@ def generate_launch_description(): nmea_navsat_launch = IncludeLaunchDescription( PythonLaunchDescriptionSource( PathJoinSubstitution( - [FindPackageShare("panther_localization"), "launch", "nmea_navsat.launch.py"] + [FindPackageShare("husarion_ugv_localization"), "launch", "nmea_navsat.launch.py"] ) ), launch_arguments={"namespace": namespace}.items(), diff --git a/panther_localization/launch/nmea_navsat.launch.py b/husarion_ugv_localization/launch/nmea_navsat.launch.py similarity index 96% rename from panther_localization/launch/nmea_navsat.launch.py rename to husarion_ugv_localization/launch/nmea_navsat.launch.py index 585438f26..9799a2574 100644 --- a/panther_localization/launch/nmea_navsat.launch.py +++ b/husarion_ugv_localization/launch/nmea_navsat.launch.py @@ -37,7 +37,7 @@ def generate_launch_description(): declare_params_file_arg = DeclareLaunchArgument( "params_file", default_value=PathJoinSubstitution( - [FindPackageShare("panther_localization"), "config", "nmea_navsat_params.yaml"] + [FindPackageShare("husarion_ugv_localization"), "config", "nmea_navsat_params.yaml"] ), description="Path to the parameter file for the nmea_socket_driver node.", ) diff --git a/panther_localization/package.xml b/husarion_ugv_localization/package.xml similarity index 87% rename from panther_localization/package.xml rename to husarion_ugv_localization/package.xml index 7cef452ad..3625e5d92 100644 --- a/panther_localization/package.xml +++ b/husarion_ugv_localization/package.xml @@ -1,9 +1,9 @@ - panther_localization + husarion_ugv_localization 2.1.1 - robot localization configuration for Panther + robot localization configuration for Husarion UGV robots Husarion Apache License 2.0 diff --git a/panther_manager/CHANGELOG.rst b/husarion_ugv_manager/CHANGELOG.rst similarity index 100% rename from panther_manager/CHANGELOG.rst rename to husarion_ugv_manager/CHANGELOG.rst diff --git a/panther_manager/CMakeLists.txt b/husarion_ugv_manager/CMakeLists.txt similarity index 95% rename from panther_manager/CMakeLists.txt rename to husarion_ugv_manager/CMakeLists.txt index fbf7fc924..292866117 100644 --- a/panther_manager/CMakeLists.txt +++ b/husarion_ugv_manager/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.8) -project(panther_manager) +project(husarion_ugv_manager) if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options(-Wall -Wextra -Wpedantic) @@ -12,7 +12,7 @@ set(PACKAGE_DEPENDENCIES behaviortree_ros2 libssh panther_msgs - panther_utils + husarion_ugv_utils rclcpp rclcpp_action sensor_msgs @@ -67,7 +67,7 @@ ament_target_dependencies( safety_manager_node behaviortree_ros2 panther_msgs - panther_utils + husarion_ugv_utils rclcpp sensor_msgs std_msgs) @@ -80,7 +80,7 @@ ament_target_dependencies( lights_manager_node behaviortree_ros2 panther_msgs - panther_utils + husarion_ugv_utils rclcpp sensor_msgs std_msgs) @@ -167,8 +167,9 @@ if(BUILD_TESTING) ${PROJECT_NAME}_test_behavior_tree_utils PUBLIC $ $) - ament_target_dependencies(${PROJECT_NAME}_test_behavior_tree_utils - behaviortree_cpp behaviortree_ros2 panther_utils) + ament_target_dependencies( + ${PROJECT_NAME}_test_behavior_tree_utils behaviortree_cpp behaviortree_ros2 + husarion_ugv_utils) ament_add_gtest( ${PROJECT_NAME}_test_behavior_tree_manager @@ -178,7 +179,7 @@ if(BUILD_TESTING) PUBLIC $ $) ament_target_dependencies(${PROJECT_NAME}_test_behavior_tree_manager - behaviortree_cpp panther_utils) + behaviortree_cpp husarion_ugv_utils) ament_add_gtest( ${PROJECT_NAME}_test_lights_manager_node test/test_lights_manager_node.cpp @@ -192,7 +193,7 @@ if(BUILD_TESTING) behaviortree_cpp behaviortree_ros2 panther_msgs - panther_utils + husarion_ugv_utils rclcpp sensor_msgs std_msgs) @@ -210,7 +211,7 @@ if(BUILD_TESTING) behaviortree_cpp behaviortree_ros2 panther_msgs - panther_utils + husarion_ugv_utils rclcpp sensor_msgs std_msgs) @@ -227,7 +228,7 @@ if(BUILD_TESTING) behaviortree_cpp behaviortree_ros2 panther_msgs - panther_utils + husarion_ugv_utils rclcpp sensor_msgs std_msgs) @@ -245,7 +246,7 @@ if(BUILD_TESTING) behaviortree_cpp behaviortree_ros2 panther_msgs - panther_utils + husarion_ugv_utils rclcpp sensor_msgs std_msgs diff --git a/panther_manager/CONFIGURATION.md b/husarion_ugv_manager/CONFIGURATION.md similarity index 96% rename from panther_manager/CONFIGURATION.md rename to husarion_ugv_manager/CONFIGURATION.md index 6454c886a..adc2337aa 100644 --- a/panther_manager/CONFIGURATION.md +++ b/husarion_ugv_manager/CONFIGURATION.md @@ -1,4 +1,4 @@ -# panther_manager +# husarion_ugv_manager ## Shutdown Behavior @@ -39,7 +39,7 @@ ssh-copy-id username@10.15.20.XX ## Faults Handle -After receiving a message on the `battery/battery_status` topic, the `panther_manager` node makes decisions regarding safety measures. For more information regarding the power supply status, please refer to the [BatteryState](https://docs.ros2.org/latest/api/sensor_msgs/msg/BatteryState.html) message definition and [adc_battery.cpp](../panther_battery/src/battery/adc_battery.cpp) implementation. +After receiving a message on the `battery/battery_status` topic, the `husarion_ugv_manager` node makes decisions regarding safety measures. For more information regarding the power supply status, please refer to the [BatteryState](https://docs.ros2.org/latest/api/sensor_msgs/msg/BatteryState.html) message definition and [adc_battery.cpp](../husarion_ugv_battery/src/battery/adc_battery.cpp) implementation. | Power Supply Health | Procedure | | ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -204,7 +204,7 @@ To use your customized project, you can modify the `bt_project_file` ROS paramet ### Real-time Visualization -Groot2 also provides a real-time visualization tool that allows you to see and debug actively running trees. To use this tool with trees launched with the `panther_manager` package, you need to specify the port associated with the tree you want to visualize. The ports for each tree are listed below: +Groot2 also provides a real-time visualization tool that allows you to see and debug actively running trees. To use this tool with trees launched with the `husarion_ugv_manager` package, you need to specify the port associated with the tree you want to visualize. The ports for each tree are listed below: - Lights tree: `10.15.20.2:5555` - Safety tree: `10.15.20.2:6666` diff --git a/panther_manager/README.md b/husarion_ugv_manager/README.md similarity index 95% rename from panther_manager/README.md rename to husarion_ugv_manager/README.md index 718abece8..bf7c8b00e 100644 --- a/panther_manager/README.md +++ b/husarion_ugv_manager/README.md @@ -1,6 +1,6 @@ -# panther_manager +# husarion_ugv_manager -A package containing nodes responsible for high-level control of Husarion Panther robot. +A package containing nodes responsible for high-level control of Husarion UGV robots. ## Launch Files @@ -42,7 +42,7 @@ Node responsible for managing Bumper Lights animation scheduling. - `battery.percent.threshold.critical` [*float*, default: **0.1**]: If the Battery percentage drops below this value, an animation indicating a critical Battery state will start being displayed. - `battery.percent.threshold.low` [*float*, default: **0.4**]: If the Battery percentage drops below this value, the animation indicating a low Battery state will start being displayed. - `battery.percent.window_len` [*int*, default: **6**]: Moving average window length used to smooth out Battery percentage readings. -- `bt_project_path` [*string*, default: **$(find panther_manager)/config/PantherBT.btproj**]: Path to a BehaviorTree project. +- `bt_project_path` [*string*, default: **$(find husarion_ugv_manager)/config/PantherBT.btproj**]: Path to a BehaviorTree project. - `plugin_libs` [*list*, default: **Empty list**]: List with names of plugins that are used in the BT project. - `ros_communication_timeout.availability` [*float*, default: **1.0**]: Timeout **[s]** to wait for a service/action while initializing BT node. - `ros_communication_timeout.response` [*float*, default: **1.0**]: Timeout **[s]** to receive a service/action response after call. @@ -70,7 +70,7 @@ Node responsible for managing safety features, and software shutdown of componen #### Parameters - `battery.temp.window_len` [*int*, default: **6**]: Moving average window length used to smooth out temperature readings of the Battery. -- `bt_project_path` [*string*, default: **$(find panther_manager)/config/PantherBT.btproj**]: Path to a BehaviorTree project. +- `bt_project_path` [*string*, default: **$(find husarion_ugv_manager)/config/PantherBT.btproj**]: Path to a BehaviorTree project. - `cpu.temp.fan_off` [*float*, default: **60.0**]: Temperature in **[°C]** of the Built-in Computer's CPU, below which the fan is turned off. - `cpu.temp.fan_on` [*float*, default: **70.0**]: Temperature in **[°C]** of the Built-in Computer's CPU, above which the fan is turned on. - `cpu.temp.window_len` [*int*, default: **6**]: Moving average window length used to smooth out temperature readings of the Built-in Computer's CPU. diff --git a/panther_manager/behavior_trees/PantherLightsBT.btproj b/husarion_ugv_manager/behavior_trees/PantherLightsBT.btproj similarity index 100% rename from panther_manager/behavior_trees/PantherLightsBT.btproj rename to husarion_ugv_manager/behavior_trees/PantherLightsBT.btproj diff --git a/panther_manager/behavior_trees/PantherSafetyBT.btproj b/husarion_ugv_manager/behavior_trees/PantherSafetyBT.btproj similarity index 100% rename from panther_manager/behavior_trees/PantherSafetyBT.btproj rename to husarion_ugv_manager/behavior_trees/PantherSafetyBT.btproj diff --git a/panther_manager/behavior_trees/lights.xml b/husarion_ugv_manager/behavior_trees/lights.xml similarity index 100% rename from panther_manager/behavior_trees/lights.xml rename to husarion_ugv_manager/behavior_trees/lights.xml diff --git a/panther_manager/behavior_trees/safety.xml b/husarion_ugv_manager/behavior_trees/safety.xml similarity index 100% rename from panther_manager/behavior_trees/safety.xml rename to husarion_ugv_manager/behavior_trees/safety.xml diff --git a/panther_manager/behavior_trees/shutdown.xml b/husarion_ugv_manager/behavior_trees/shutdown.xml similarity index 100% rename from panther_manager/behavior_trees/shutdown.xml rename to husarion_ugv_manager/behavior_trees/shutdown.xml diff --git a/panther_manager/config/lights_manager.yaml b/husarion_ugv_manager/config/lights_manager.yaml similarity index 100% rename from panther_manager/config/lights_manager.yaml rename to husarion_ugv_manager/config/lights_manager.yaml diff --git a/panther_manager/config/safety_manager.yaml b/husarion_ugv_manager/config/safety_manager.yaml similarity index 100% rename from panther_manager/config/safety_manager.yaml rename to husarion_ugv_manager/config/safety_manager.yaml diff --git a/panther_manager/config/shutdown_hosts.yaml b/husarion_ugv_manager/config/shutdown_hosts.yaml similarity index 100% rename from panther_manager/config/shutdown_hosts.yaml rename to husarion_ugv_manager/config/shutdown_hosts.yaml diff --git a/panther_manager/include/panther_manager/behavior_tree_manager.hpp b/husarion_ugv_manager/include/husarion_ugv_manager/behavior_tree_manager.hpp similarity index 92% rename from panther_manager/include/panther_manager/behavior_tree_manager.hpp rename to husarion_ugv_manager/include/husarion_ugv_manager/behavior_tree_manager.hpp index 24d6eed00..831a0c7bf 100644 --- a/panther_manager/include/panther_manager/behavior_tree_manager.hpp +++ b/husarion_ugv_manager/include/husarion_ugv_manager/behavior_tree_manager.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_MANAGER_BEHAVIOR_TREE_MANAGER_HPP_ -#define PANTHER_MANAGER_BEHAVIOR_TREE_MANAGER_HPP_ +#ifndef HUSARION_UGV_MANAGER_BEHAVIOR_TREE_MANAGER_HPP_ +#define HUSARION_UGV_MANAGER_BEHAVIOR_TREE_MANAGER_HPP_ #include #include @@ -24,7 +24,7 @@ #include "behaviortree_cpp/loggers/groot2_publisher.h" #include "rclcpp/rclcpp.hpp" -namespace panther_manager +namespace husarion_ugv_manager { /** @@ -93,6 +93,6 @@ class BehaviorTreeManager std::unique_ptr groot_publisher_; }; -} // namespace panther_manager +} // namespace husarion_ugv_manager -#endif // PANTHER_MANAGER_BEHAVIOR_TREE_MANAGER_HPP_ +#endif // HUSARION_UGV_MANAGER_BEHAVIOR_TREE_MANAGER_HPP_ diff --git a/panther_manager/include/panther_manager/behavior_tree_utils.hpp b/husarion_ugv_manager/include/husarion_ugv_manager/behavior_tree_utils.hpp similarity index 89% rename from panther_manager/include/panther_manager/behavior_tree_utils.hpp rename to husarion_ugv_manager/include/husarion_ugv_manager/behavior_tree_utils.hpp index 360e174e8..8d411136b 100644 --- a/panther_manager/include/panther_manager/behavior_tree_utils.hpp +++ b/husarion_ugv_manager/include/husarion_ugv_manager/behavior_tree_utils.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_MANAGER_BEHAVIOR_TREE_UTILS_HPP_ -#define PANTHER_MANAGER_BEHAVIOR_TREE_UTILS_HPP_ +#ifndef HUSARION_UGV_MANAGER_BEHAVIOR_TREE_UTILS_HPP_ +#define HUSARION_UGV_MANAGER_BEHAVIOR_TREE_UTILS_HPP_ #include #include @@ -26,7 +26,7 @@ #include "behaviortree_cpp/utils/shared_library.h" #include "behaviortree_ros2/plugins.hpp" -namespace panther_manager::behavior_tree_utils +namespace husarion_ugv_manager::behavior_tree_utils { /** @@ -73,9 +73,9 @@ inline void RegisterBehaviorTree( RegisterBehaviorTree(factory, bt_project_path, plugin_libs); } -} // namespace panther_manager::behavior_tree_utils +} // namespace husarion_ugv_manager::behavior_tree_utils -namespace panther_manager +namespace husarion_ugv_manager { // TODO: @pawelirh move to a separate file with an appropriate abstraction layer /** @@ -88,6 +88,6 @@ inline std::string GetLoggerPrefix(const std::string & bt_node_name) { return std::string("[" + bt_node_name + "] "); } -} // namespace panther_manager +} // namespace husarion_ugv_manager -#endif // PANTHER_MANAGER_BEHAVIOR_TREE_UTILS_HPP_ +#endif // HUSARION_UGV_MANAGER_BEHAVIOR_TREE_UTILS_HPP_ diff --git a/panther_manager/include/panther_manager/lights_manager_node.hpp b/husarion_ugv_manager/include/husarion_ugv_manager/lights_manager_node.hpp similarity index 84% rename from panther_manager/include/panther_manager/lights_manager_node.hpp rename to husarion_ugv_manager/include/husarion_ugv_manager/lights_manager_node.hpp index 21937cd86..6fd54433e 100644 --- a/panther_manager/include/panther_manager/lights_manager_node.hpp +++ b/husarion_ugv_manager/include/husarion_ugv_manager/lights_manager_node.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_MANAGER_LIGHTS_MANAGER_NODE_HPP_ -#define PANTHER_MANAGER_LIGHTS_MANAGER_NODE_HPP_ +#ifndef HUSARION_UGV_MANAGER_LIGHTS_MANAGER_NODE_HPP_ +#define HUSARION_UGV_MANAGER_LIGHTS_MANAGER_NODE_HPP_ #include #include @@ -26,11 +26,11 @@ #include "panther_msgs/msg/led_animation.hpp" -#include "panther_utils/moving_average.hpp" +#include "husarion_ugv_utils/moving_average.hpp" -#include +#include -namespace panther_manager +namespace husarion_ugv_manager { using BatteryStateMsg = sensor_msgs::msg::BatteryState; @@ -77,10 +77,10 @@ class LightsManagerNode : public rclcpp::Node rclcpp::Subscription::SharedPtr e_stop_sub_; rclcpp::TimerBase::SharedPtr lights_tree_timer_; - std::unique_ptr> battery_percent_ma_; + std::unique_ptr> battery_percent_ma_; BT::BehaviorTreeFactory factory_; }; -} // namespace panther_manager +} // namespace husarion_ugv_manager -#endif // PANTHER_MANAGER_LIGHTS_MANAGER_NODE_HPP_ +#endif // HUSARION_UGV_MANAGER_LIGHTS_MANAGER_NODE_HPP_ diff --git a/panther_manager/include/panther_manager/plugins/action/call_set_bool_service_node.hpp b/husarion_ugv_manager/include/husarion_ugv_manager/plugins/action/call_set_bool_service_node.hpp similarity index 81% rename from panther_manager/include/panther_manager/plugins/action/call_set_bool_service_node.hpp rename to husarion_ugv_manager/include/husarion_ugv_manager/plugins/action/call_set_bool_service_node.hpp index adafe1d46..f9bfae2ee 100644 --- a/panther_manager/include/panther_manager/plugins/action/call_set_bool_service_node.hpp +++ b/husarion_ugv_manager/include/husarion_ugv_manager/plugins/action/call_set_bool_service_node.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_MANAGER_PLUGINS_ACTION_CALL_SET_BOOL_SERVICE_NODE_HPP_ -#define PANTHER_MANAGER_PLUGINS_ACTION_CALL_SET_BOOL_SERVICE_NODE_HPP_ +#ifndef HUSARION_UGV_MANAGER_PLUGINS_ACTION_CALL_SET_BOOL_SERVICE_NODE_HPP_ +#define HUSARION_UGV_MANAGER_PLUGINS_ACTION_CALL_SET_BOOL_SERVICE_NODE_HPP_ #include @@ -22,7 +22,7 @@ #include "std_srvs/srv/set_bool.hpp" -namespace panther_manager +namespace husarion_ugv_manager { class CallSetBoolService : public BT::RosServiceNode @@ -43,6 +43,6 @@ class CallSetBoolService : public BT::RosServiceNode virtual BT::NodeStatus onResponseReceived(const typename Response::SharedPtr & response) override; }; -} // namespace panther_manager +} // namespace husarion_ugv_manager -#endif // PANTHER_MANAGER_PLUGINS_ACTION_CALL_SET_BOOL_SERVICE_NODE_HPP_ +#endif // HUSARION_UGV_MANAGER_PLUGINS_ACTION_CALL_SET_BOOL_SERVICE_NODE_HPP_ diff --git a/panther_manager/include/panther_manager/plugins/action/call_set_led_animation_service_node.hpp b/husarion_ugv_manager/include/husarion_ugv_manager/plugins/action/call_set_led_animation_service_node.hpp similarity index 82% rename from panther_manager/include/panther_manager/plugins/action/call_set_led_animation_service_node.hpp rename to husarion_ugv_manager/include/husarion_ugv_manager/plugins/action/call_set_led_animation_service_node.hpp index 38a915a5a..4fa2f8f83 100644 --- a/panther_manager/include/panther_manager/plugins/action/call_set_led_animation_service_node.hpp +++ b/husarion_ugv_manager/include/husarion_ugv_manager/plugins/action/call_set_led_animation_service_node.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_MANAGER_PLUGINS_ACTION_CALL_SET_LED_ANIMATION_SERVICE_NODE_HPP_ -#define PANTHER_MANAGER_PLUGINS_ACTION_CALL_SET_LED_ANIMATION_SERVICE_NODE_HPP_ +#ifndef HUSARION_UGV_MANAGER_PLUGINS_ACTION_CALL_SET_LED_ANIMATION_SERVICE_NODE_HPP_ +#define HUSARION_UGV_MANAGER_PLUGINS_ACTION_CALL_SET_LED_ANIMATION_SERVICE_NODE_HPP_ #include @@ -22,7 +22,7 @@ #include "panther_msgs/srv/set_led_animation.hpp" -namespace panther_manager +namespace husarion_ugv_manager { class CallSetLedAnimationService : public BT::RosServiceNode @@ -47,6 +47,6 @@ class CallSetLedAnimationService : public BT::RosServiceNode @@ -22,7 +22,7 @@ #include "std_srvs/srv/trigger.hpp" -namespace panther_manager +namespace husarion_ugv_manager { class CallTriggerService : public BT::RosServiceNode @@ -40,6 +40,6 @@ class CallTriggerService : public BT::RosServiceNode virtual BT::NodeStatus onResponseReceived(const typename Response::SharedPtr & response) override; }; -} // namespace panther_manager +} // namespace husarion_ugv_manager -#endif // PANTHER_MANAGER_PLUGINS_ACTION_CALL_TRIGGER_SERVICE_NODE_HPP_ +#endif // HUSARION_UGV_MANAGER_PLUGINS_ACTION_CALL_TRIGGER_SERVICE_NODE_HPP_ diff --git a/panther_manager/include/panther_manager/plugins/action/shutdown_hosts_from_file_node.hpp b/husarion_ugv_manager/include/husarion_ugv_manager/plugins/action/shutdown_hosts_from_file_node.hpp similarity index 71% rename from panther_manager/include/panther_manager/plugins/action/shutdown_hosts_from_file_node.hpp rename to husarion_ugv_manager/include/husarion_ugv_manager/plugins/action/shutdown_hosts_from_file_node.hpp index 949565f61..10396a8c2 100644 --- a/panther_manager/include/panther_manager/plugins/action/shutdown_hosts_from_file_node.hpp +++ b/husarion_ugv_manager/include/husarion_ugv_manager/plugins/action/shutdown_hosts_from_file_node.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_MANAGER_PLUGINS_ACTION_SHUTDOWN_HOST_FROM_FILE_NODE_HPP_ -#define PANTHER_MANAGER_PLUGINS_ACTION_SHUTDOWN_HOST_FROM_FILE_NODE_HPP_ +#ifndef HUSARION_UGV_MANAGER_PLUGINS_ACTION_SHUTDOWN_HOST_FROM_FILE_NODE_HPP_ +#define HUSARION_UGV_MANAGER_PLUGINS_ACTION_SHUTDOWN_HOST_FROM_FILE_NODE_HPP_ #include #include @@ -22,11 +22,11 @@ #include "behaviortree_cpp/basic_types.h" #include "yaml-cpp/yaml.h" -#include "panther_manager/plugins/shutdown_host.hpp" -#include "panther_manager/plugins/shutdown_hosts_node.hpp" -#include "panther_utils/yaml_utils.hpp" +#include "husarion_ugv_manager/plugins/shutdown_host.hpp" +#include "husarion_ugv_manager/plugins/shutdown_hosts_node.hpp" +#include "husarion_ugv_utils/yaml_utils.hpp" -namespace panther_manager +namespace husarion_ugv_manager { class ShutdownHostsFromFile : public ShutdownHosts @@ -49,6 +49,6 @@ class ShutdownHostsFromFile : public ShutdownHosts bool UpdateHosts(std::vector> & hosts) override; }; -} // namespace panther_manager +} // namespace husarion_ugv_manager -#endif // PANTHER_MANAGER_PLUGINS_ACTION_SHUTDOWN_HOST_FROM_FILE_NODE_HPP_ +#endif // HUSARION_UGV_MANAGER_PLUGINS_ACTION_SHUTDOWN_HOST_FROM_FILE_NODE_HPP_ diff --git a/panther_manager/include/panther_manager/plugins/action/shutdown_single_host_node.hpp b/husarion_ugv_manager/include/husarion_ugv_manager/plugins/action/shutdown_single_host_node.hpp similarity index 78% rename from panther_manager/include/panther_manager/plugins/action/shutdown_single_host_node.hpp rename to husarion_ugv_manager/include/husarion_ugv_manager/plugins/action/shutdown_single_host_node.hpp index 630db6505..be36a7f96 100644 --- a/panther_manager/include/panther_manager/plugins/action/shutdown_single_host_node.hpp +++ b/husarion_ugv_manager/include/husarion_ugv_manager/plugins/action/shutdown_single_host_node.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_MANAGER_PLUGINS_ACTION_SHUTDOWN_SINGLE_HOST_NODE_HPP_ -#define PANTHER_MANAGER_PLUGINS_ACTION_SHUTDOWN_SINGLE_HOST_NODE_HPP_ +#ifndef HUSARION_UGV_MANAGER_PLUGINS_ACTION_SHUTDOWN_SINGLE_HOST_NODE_HPP_ +#define HUSARION_UGV_MANAGER_PLUGINS_ACTION_SHUTDOWN_SINGLE_HOST_NODE_HPP_ #include #include @@ -21,10 +21,10 @@ #include "behaviortree_cpp/basic_types.h" -#include "panther_manager/plugins/shutdown_host.hpp" -#include "panther_manager/plugins/shutdown_hosts_node.hpp" +#include "husarion_ugv_manager/plugins/shutdown_host.hpp" +#include "husarion_ugv_manager/plugins/shutdown_hosts_node.hpp" -namespace panther_manager +namespace husarion_ugv_manager { class ShutdownSingleHost : public ShutdownHosts @@ -52,6 +52,6 @@ class ShutdownSingleHost : public ShutdownHosts bool UpdateHosts(std::vector> & hosts) override; }; -} // namespace panther_manager +} // namespace husarion_ugv_manager -#endif // PANTHER_MANAGER_PLUGINS_ACTION_SHUTDOWN_SINGLE_HOST_NODE_HPP_ +#endif // HUSARION_UGV_MANAGER_PLUGINS_ACTION_SHUTDOWN_SINGLE_HOST_NODE_HPP_ diff --git a/panther_manager/include/panther_manager/plugins/action/signal_shutdown_node.hpp b/husarion_ugv_manager/include/husarion_ugv_manager/plugins/action/signal_shutdown_node.hpp similarity index 79% rename from panther_manager/include/panther_manager/plugins/action/signal_shutdown_node.hpp rename to husarion_ugv_manager/include/husarion_ugv_manager/plugins/action/signal_shutdown_node.hpp index 7bc9709db..8e98387e0 100644 --- a/panther_manager/include/panther_manager/plugins/action/signal_shutdown_node.hpp +++ b/husarion_ugv_manager/include/husarion_ugv_manager/plugins/action/signal_shutdown_node.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_MANAGER_PLUGINS_ACTION_SIGNAL_SHUTDOWN_NODE_HPP_ -#define PANTHER_MANAGER_PLUGINS_ACTION_SIGNAL_SHUTDOWN_NODE_HPP_ +#ifndef HUSARION_UGV_MANAGER_PLUGINS_ACTION_SIGNAL_SHUTDOWN_NODE_HPP_ +#define HUSARION_UGV_MANAGER_PLUGINS_ACTION_SIGNAL_SHUTDOWN_NODE_HPP_ #include @@ -21,7 +21,7 @@ #include "behaviortree_cpp/basic_types.h" #include "behaviortree_cpp/tree_node.h" -namespace panther_manager +namespace husarion_ugv_manager { class SignalShutdown : public BT::SyncActionNode @@ -42,6 +42,6 @@ class SignalShutdown : public BT::SyncActionNode virtual BT::NodeStatus tick() override; }; -} // namespace panther_manager +} // namespace husarion_ugv_manager -#endif // PANTHER_MANAGER_PLUGINS_ACTION_SIGNAL_SHUTDOWN_NODE_HPP_ +#endif // HUSARION_UGV_MANAGER_PLUGINS_ACTION_SIGNAL_SHUTDOWN_NODE_HPP_ diff --git a/panther_manager/include/panther_manager/plugins/decorator/tick_after_timeout_node.hpp b/husarion_ugv_manager/include/husarion_ugv_manager/plugins/decorator/tick_after_timeout_node.hpp similarity index 80% rename from panther_manager/include/panther_manager/plugins/decorator/tick_after_timeout_node.hpp rename to husarion_ugv_manager/include/husarion_ugv_manager/plugins/decorator/tick_after_timeout_node.hpp index 20a273e5f..a453054f0 100644 --- a/panther_manager/include/panther_manager/plugins/decorator/tick_after_timeout_node.hpp +++ b/husarion_ugv_manager/include/husarion_ugv_manager/plugins/decorator/tick_after_timeout_node.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_MANAGER_PLUGINS_DECORATOR_TICK_AFTER_TIMEOUT_NODE_HPP_ -#define PANTHER_MANAGER_PLUGINS_DECORATOR_TICK_AFTER_TIMEOUT_NODE_HPP_ +#ifndef HUSARION_UGV_MANAGER_PLUGINS_DECORATOR_TICK_AFTER_TIMEOUT_NODE_HPP_ +#define HUSARION_UGV_MANAGER_PLUGINS_DECORATOR_TICK_AFTER_TIMEOUT_NODE_HPP_ #include #include @@ -22,7 +22,7 @@ #include "behaviortree_cpp/decorator_node.h" #include "behaviortree_cpp/tree_node.h" -namespace panther_manager +namespace husarion_ugv_manager { class TickAfterTimeout : public BT::DecoratorNode { @@ -40,6 +40,6 @@ class TickAfterTimeout : public BT::DecoratorNode BT::NodeStatus tick() override; }; -} // namespace panther_manager +} // namespace husarion_ugv_manager -#endif // PANTHER_MANAGER_PLUGINS_DECORATOR_TICK_AFTER_TIMEOUT_NODE_HPP_ +#endif // HUSARION_UGV_MANAGER_PLUGINS_DECORATOR_TICK_AFTER_TIMEOUT_NODE_HPP_ diff --git a/panther_manager/include/panther_manager/plugins/shutdown_host.hpp b/husarion_ugv_manager/include/husarion_ugv_manager/plugins/shutdown_host.hpp similarity index 96% rename from panther_manager/include/panther_manager/plugins/shutdown_host.hpp rename to husarion_ugv_manager/include/husarion_ugv_manager/plugins/shutdown_host.hpp index ce29367a1..6f4729bad 100644 --- a/panther_manager/include/panther_manager/plugins/shutdown_host.hpp +++ b/husarion_ugv_manager/include/husarion_ugv_manager/plugins/shutdown_host.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_MANAGER_PLUGINS_SHUTDOWN_HOST_HPP_ -#define PANTHER_MANAGER_PLUGINS_SHUTDOWN_HOST_HPP_ +#ifndef HUSARION_UGV_MANAGER_PLUGINS_SHUTDOWN_HOST_HPP_ +#define HUSARION_UGV_MANAGER_PLUGINS_SHUTDOWN_HOST_HPP_ #include #include @@ -25,7 +25,7 @@ #include "libssh/libsshpp.hpp" -namespace panther_manager +namespace husarion_ugv_manager { enum class ShutdownHostState { @@ -268,6 +268,6 @@ class ShutdownHost } }; -} // namespace panther_manager +} // namespace husarion_ugv_manager -#endif // PANTHER_MANAGER_PLUGINS_SHUTDOWN_HOST_HPP_ +#endif // HUSARION_UGV_MANAGER_PLUGINS_SHUTDOWN_HOST_HPP_ diff --git a/panther_manager/include/panther_manager/plugins/shutdown_hosts_node.hpp b/husarion_ugv_manager/include/husarion_ugv_manager/plugins/shutdown_hosts_node.hpp similarity index 93% rename from panther_manager/include/panther_manager/plugins/shutdown_hosts_node.hpp rename to husarion_ugv_manager/include/husarion_ugv_manager/plugins/shutdown_hosts_node.hpp index 004c94a45..5c7b11ad3 100644 --- a/panther_manager/include/panther_manager/plugins/shutdown_hosts_node.hpp +++ b/husarion_ugv_manager/include/husarion_ugv_manager/plugins/shutdown_hosts_node.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_MANAGER_PLUGINS_SHUTDOWN_HOSTS_NODE_HPP_ -#define PANTHER_MANAGER_PLUGINS_SHUTDOWN_HOSTS_NODE_HPP_ +#ifndef HUSARION_UGV_MANAGER_PLUGINS_SHUTDOWN_HOSTS_NODE_HPP_ +#define HUSARION_UGV_MANAGER_PLUGINS_SHUTDOWN_HOSTS_NODE_HPP_ #include #include @@ -29,11 +29,11 @@ #include "behaviortree_cpp/tree_node.h" #include "rclcpp/rclcpp.hpp" -#include "panther_manager/plugins/shutdown_host.hpp" +#include "husarion_ugv_manager/plugins/shutdown_host.hpp" -#include "panther_manager/behavior_tree_utils.hpp" +#include "husarion_ugv_manager/behavior_tree_utils.hpp" -namespace panther_manager +namespace husarion_ugv_manager { class ShutdownHosts : public BT::StatefulActionNode @@ -177,6 +177,6 @@ class ShutdownHosts : public BT::StatefulActionNode } }; -} // namespace panther_manager +} // namespace husarion_ugv_manager -#endif // PANTHER_MANAGER_PLUGINS_SHUTDOWN_HOSTS_NODE_HPP_ +#endif // HUSARION_UGV_MANAGER_PLUGINS_SHUTDOWN_HOSTS_NODE_HPP_ diff --git a/panther_manager/include/panther_manager/safety_manager_node.hpp b/husarion_ugv_manager/include/husarion_ugv_manager/safety_manager_node.hpp similarity index 84% rename from panther_manager/include/panther_manager/safety_manager_node.hpp rename to husarion_ugv_manager/include/husarion_ugv_manager/safety_manager_node.hpp index cde19e962..51dcb3e2a 100644 --- a/panther_manager/include/panther_manager/safety_manager_node.hpp +++ b/husarion_ugv_manager/include/husarion_ugv_manager/safety_manager_node.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_MANAGER_SAFETY_MANAGER_NODE_HPP_ -#define PANTHER_MANAGER_SAFETY_MANAGER_NODE_HPP_ +#ifndef HUSARION_UGV_MANAGER_SAFETY_MANAGER_NODE_HPP_ +#define HUSARION_UGV_MANAGER_SAFETY_MANAGER_NODE_HPP_ #include #include @@ -29,11 +29,11 @@ #include "panther_msgs/msg/robot_driver_state.hpp" #include "panther_msgs/msg/system_status.hpp" -#include "panther_utils/moving_average.hpp" +#include "husarion_ugv_utils/moving_average.hpp" -#include +#include -namespace panther_manager +namespace husarion_ugv_manager { using BatteryStateMsg = sensor_msgs::msg::BatteryState; @@ -96,12 +96,12 @@ class SafetyManagerNode : public rclcpp::Node rclcpp::Subscription::SharedPtr system_status_sub_; rclcpp::TimerBase::SharedPtr safety_tree_timer_; - std::unique_ptr> battery_temp_ma_; - std::unique_ptr> cpu_temp_ma_; + std::unique_ptr> battery_temp_ma_; + std::unique_ptr> cpu_temp_ma_; - std::map>> driver_temp_ma_; + std::map>> driver_temp_ma_; }; -} // namespace panther_manager +} // namespace husarion_ugv_manager -#endif // PANTHER_MANAGER_SAFETY_MANAGER_NODE_HPP_ +#endif // HUSARION_UGV_MANAGER_SAFETY_MANAGER_NODE_HPP_ diff --git a/panther_manager/launch/manager.launch.py b/husarion_ugv_manager/launch/manager.launch.py similarity index 86% rename from panther_manager/launch/manager.launch.py rename to husarion_ugv_manager/launch/manager.launch.py index 0aaf5385b..9b44bf231 100644 --- a/panther_manager/launch/manager.launch.py +++ b/husarion_ugv_manager/launch/manager.launch.py @@ -28,13 +28,13 @@ def generate_launch_description(): - panther_manager_dir = FindPackageShare("panther_manager") + husarion_ugv_manager_dir = FindPackageShare("husarion_ugv_manager") lights_bt_project_path = LaunchConfiguration("lights_bt_project_path") declare_lights_bt_project_path_arg = DeclareLaunchArgument( "lights_bt_project_path", default_value=PathJoinSubstitution( - [panther_manager_dir, "behavior_trees", "PantherLightsBT.btproj"] + [husarion_ugv_manager_dir, "behavior_trees", "PantherLightsBT.btproj"] ), description="Path to BehaviorTree project file, responsible for lights management.", ) @@ -50,7 +50,7 @@ def generate_launch_description(): declare_safety_bt_project_path_arg = DeclareLaunchArgument( "safety_bt_project_path", default_value=PathJoinSubstitution( - [panther_manager_dir, "behavior_trees", "PantherSafetyBT.btproj"] + [husarion_ugv_manager_dir, "behavior_trees", "PantherSafetyBT.btproj"] ), description="Path to BehaviorTree project file, responsible for safety and shutdown management.", ) @@ -60,7 +60,7 @@ def generate_launch_description(): "shutdown_hosts_config_path", default_value=PathJoinSubstitution( [ - FindPackageShare("panther_manager"), + FindPackageShare("husarion_ugv_manager"), "config", "shutdown_hosts.yaml", ] @@ -76,11 +76,11 @@ def generate_launch_description(): ) lights_manager_node = Node( - package="panther_manager", + package="husarion_ugv_manager", executable="lights_manager_node", name="lights_manager", parameters=[ - PathJoinSubstitution([panther_manager_dir, "config", "lights_manager.yaml"]), + PathJoinSubstitution([husarion_ugv_manager_dir, "config", "lights_manager.yaml"]), {"bt_project_path": lights_bt_project_path}, ], namespace=namespace, @@ -88,11 +88,11 @@ def generate_launch_description(): ) safety_manager_node = Node( - package="panther_manager", + package="husarion_ugv_manager", executable="safety_manager_node", name="safety_manager", parameters=[ - PathJoinSubstitution([panther_manager_dir, "config", "safety_manager.yaml"]), + PathJoinSubstitution([husarion_ugv_manager_dir, "config", "safety_manager.yaml"]), { "bt_project_path": safety_bt_project_path, "shutdown_hosts_path": shutdown_hosts_config_path, diff --git a/panther_manager/package.xml b/husarion_ugv_manager/package.xml similarity index 92% rename from panther_manager/package.xml rename to husarion_ugv_manager/package.xml index 8310427d5..c36c5adfe 100644 --- a/panther_manager/package.xml +++ b/husarion_ugv_manager/package.xml @@ -1,10 +1,10 @@ - panther_manager + husarion_ugv_manager 2.1.1 - Set of nodes used for high level management of Husarion Panther robot + Set of nodes used for high level management of Husarion UGV robots Husarion Apache License 2.0 @@ -19,11 +19,11 @@ behaviortree_cpp behaviortree_ros2 + husarion_ugv_utils iputils-ping libboost-dev libssh-dev panther_msgs - panther_utils rclcpp rclcpp_action std_srvs diff --git a/panther_manager/src/behavior_tree_manager.cpp b/husarion_ugv_manager/src/behavior_tree_manager.cpp similarity index 94% rename from panther_manager/src/behavior_tree_manager.cpp rename to husarion_ugv_manager/src/behavior_tree_manager.cpp index f39a36463..c5beb1a46 100644 --- a/panther_manager/src/behavior_tree_manager.cpp +++ b/husarion_ugv_manager/src/behavior_tree_manager.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include +#include #include #include @@ -24,7 +24,7 @@ #include "behaviortree_cpp/loggers/groot2_publisher.h" #include "rclcpp/rclcpp.hpp" -namespace panther_manager +namespace husarion_ugv_manager { void BehaviorTreeManager::Initialize(BT::BehaviorTreeFactory & factory) @@ -66,4 +66,4 @@ BT::NodeConfig BehaviorTreeManager::CreateBTConfig( return config; } -} // namespace panther_manager +} // namespace husarion_ugv_manager diff --git a/panther_manager/src/lights_manager_node.cpp b/husarion_ugv_manager/src/lights_manager_node.cpp similarity index 94% rename from panther_manager/src/lights_manager_node.cpp rename to husarion_ugv_manager/src/lights_manager_node.cpp index 53ff612bd..7601abe79 100644 --- a/panther_manager/src/lights_manager_node.cpp +++ b/husarion_ugv_manager/src/lights_manager_node.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_manager/lights_manager_node.hpp" +#include "husarion_ugv_manager/lights_manager_node.hpp" #include #include @@ -26,12 +26,12 @@ #include "behaviortree_ros2/ros_node_params.hpp" #include "rclcpp/rclcpp.hpp" -#include "panther_utils/moving_average.hpp" +#include "husarion_ugv_utils/moving_average.hpp" -#include -#include +#include +#include -namespace panther_manager +namespace husarion_ugv_manager { LightsManagerNode::LightsManagerNode( @@ -45,7 +45,7 @@ LightsManagerNode::LightsManagerNode( const auto battery_percent_window_len = this->get_parameter("battery.percent.window_len").as_int(); - battery_percent_ma_ = std::make_unique>( + battery_percent_ma_ = std::make_unique>( battery_percent_window_len, 1.0); const auto initial_blackboard = CreateLightsInitialBlackboard(); @@ -81,9 +81,9 @@ void LightsManagerNode::Initialize() void LightsManagerNode::DeclareParameters() { - const auto panther_manager_pkg_path = - ament_index_cpp::get_package_share_directory("panther_manager"); - const std::string default_bt_project_path = panther_manager_pkg_path + + const auto husarion_ugv_manager_pkg_path = + ament_index_cpp::get_package_share_directory("husarion_ugv_manager"); + const std::string default_bt_project_path = husarion_ugv_manager_pkg_path + "/behavior_trees/PantherLightsBT.btproj"; const std::vector default_plugin_libs = {}; @@ -232,4 +232,4 @@ bool LightsManagerNode::SystemReady() return true; } -} // namespace panther_manager +} // namespace husarion_ugv_manager diff --git a/panther_manager/src/lights_manager_node_main.cpp b/husarion_ugv_manager/src/lights_manager_node_main.cpp similarity index 86% rename from panther_manager/src/lights_manager_node_main.cpp rename to husarion_ugv_manager/src/lights_manager_node_main.cpp index 92a2738bc..9fbbc3c84 100644 --- a/panther_manager/src/lights_manager_node_main.cpp +++ b/husarion_ugv_manager/src/lights_manager_node_main.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_manager/lights_manager_node.hpp" +#include "husarion_ugv_manager/lights_manager_node.hpp" #include #include @@ -22,7 +22,8 @@ int main(int argc, char ** argv) { rclcpp::init(argc, argv); - auto lights_manager_node = std::make_shared("lights_manager"); + auto lights_manager_node = + std::make_shared("lights_manager"); lights_manager_node->Initialize(); try { diff --git a/panther_manager/src/plugins/action/call_set_bool_service_node.cpp b/husarion_ugv_manager/src/plugins/action/call_set_bool_service_node.cpp similarity index 84% rename from panther_manager/src/plugins/action/call_set_bool_service_node.cpp rename to husarion_ugv_manager/src/plugins/action/call_set_bool_service_node.cpp index 561e2a5fa..b51b58b80 100644 --- a/panther_manager/src/plugins/action/call_set_bool_service_node.cpp +++ b/husarion_ugv_manager/src/plugins/action/call_set_bool_service_node.cpp @@ -12,11 +12,11 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_manager/plugins/action/call_set_bool_service_node.hpp" +#include "husarion_ugv_manager/plugins/action/call_set_bool_service_node.hpp" -#include "panther_manager/behavior_tree_utils.hpp" +#include "husarion_ugv_manager/behavior_tree_utils.hpp" -namespace panther_manager +namespace husarion_ugv_manager { bool CallSetBoolService::setRequest(typename Request::SharedPtr & request) @@ -42,7 +42,7 @@ BT::NodeStatus CallSetBoolService::onResponseReceived(const typename Response::S return BT::NodeStatus::SUCCESS; } -} // namespace panther_manager +} // namespace husarion_ugv_manager #include "behaviortree_ros2/plugins.hpp" -CreateRosNodePlugin(panther_manager::CallSetBoolService, "CallSetBoolService"); +CreateRosNodePlugin(husarion_ugv_manager::CallSetBoolService, "CallSetBoolService"); diff --git a/panther_manager/src/plugins/action/call_set_led_animation_service_node.cpp b/husarion_ugv_manager/src/plugins/action/call_set_led_animation_service_node.cpp similarity index 86% rename from panther_manager/src/plugins/action/call_set_led_animation_service_node.cpp rename to husarion_ugv_manager/src/plugins/action/call_set_led_animation_service_node.cpp index b0f22dd80..70c076429 100644 --- a/panther_manager/src/plugins/action/call_set_led_animation_service_node.cpp +++ b/husarion_ugv_manager/src/plugins/action/call_set_led_animation_service_node.cpp @@ -12,15 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_manager/plugins/action/call_set_led_animation_service_node.hpp" +#include "husarion_ugv_manager/plugins/action/call_set_led_animation_service_node.hpp" #include #include "behaviortree_cpp/basic_types.h" -#include "panther_manager/behavior_tree_utils.hpp" +#include "husarion_ugv_manager/behavior_tree_utils.hpp" -namespace panther_manager +namespace husarion_ugv_manager { bool CallSetLedAnimationService::setRequest(typename Request::SharedPtr & request) @@ -62,7 +62,7 @@ BT::NodeStatus CallSetLedAnimationService::onResponseReceived( return BT::NodeStatus::SUCCESS; } -} // namespace panther_manager +} // namespace husarion_ugv_manager #include "behaviortree_ros2/plugins.hpp" -CreateRosNodePlugin(panther_manager::CallSetLedAnimationService, "CallSetLedAnimationService"); +CreateRosNodePlugin(husarion_ugv_manager::CallSetLedAnimationService, "CallSetLedAnimationService"); diff --git a/panther_manager/src/plugins/action/call_trigger_service_node.cpp b/husarion_ugv_manager/src/plugins/action/call_trigger_service_node.cpp similarity index 83% rename from panther_manager/src/plugins/action/call_trigger_service_node.cpp rename to husarion_ugv_manager/src/plugins/action/call_trigger_service_node.cpp index e24b84631..73c70856d 100644 --- a/panther_manager/src/plugins/action/call_trigger_service_node.cpp +++ b/husarion_ugv_manager/src/plugins/action/call_trigger_service_node.cpp @@ -12,13 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_manager/plugins/action/call_trigger_service_node.hpp" +#include "husarion_ugv_manager/plugins/action/call_trigger_service_node.hpp" #include "behaviortree_cpp/basic_types.h" -#include "panther_manager/behavior_tree_utils.hpp" +#include "husarion_ugv_manager/behavior_tree_utils.hpp" -namespace panther_manager +namespace husarion_ugv_manager { bool CallTriggerService::setRequest(typename Request::SharedPtr & /*request*/) { return true; } @@ -37,7 +37,7 @@ BT::NodeStatus CallTriggerService::onResponseReceived(const typename Response::S return BT::NodeStatus::SUCCESS; } -} // namespace panther_manager +} // namespace husarion_ugv_manager #include "behaviortree_ros2/plugins.hpp" -CreateRosNodePlugin(panther_manager::CallTriggerService, "CallTriggerService"); +CreateRosNodePlugin(husarion_ugv_manager::CallTriggerService, "CallTriggerService"); diff --git a/panther_manager/src/plugins/action/shutdown_hosts_from_file_node.cpp b/husarion_ugv_manager/src/plugins/action/shutdown_hosts_from_file_node.cpp similarity index 71% rename from panther_manager/src/plugins/action/shutdown_hosts_from_file_node.cpp rename to husarion_ugv_manager/src/plugins/action/shutdown_hosts_from_file_node.cpp index 270c67a5d..a8dcfb382 100644 --- a/panther_manager/src/plugins/action/shutdown_hosts_from_file_node.cpp +++ b/husarion_ugv_manager/src/plugins/action/shutdown_hosts_from_file_node.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_manager/plugins/action/shutdown_hosts_from_file_node.hpp" +#include "husarion_ugv_manager/plugins/action/shutdown_hosts_from_file_node.hpp" #include #include @@ -24,10 +24,10 @@ #include "behaviortree_cpp/tree_node.h" #include "rclcpp/rclcpp.hpp" -#include "panther_manager/behavior_tree_utils.hpp" -#include "panther_manager/plugins/shutdown_host.hpp" +#include "husarion_ugv_manager/behavior_tree_utils.hpp" +#include "husarion_ugv_manager/plugins/shutdown_host.hpp" -namespace panther_manager +namespace husarion_ugv_manager { bool ShutdownHostsFromFile::UpdateHosts(std::vector> & hosts) @@ -59,13 +59,13 @@ bool ShutdownHostsFromFile::UpdateHosts(std::vector(host, "ip"); - const auto username = panther_utils::GetYAMLKeyValue(host, "username"); - const auto port = panther_utils::GetYAMLKeyValue(host, "port", 22); - const auto command = panther_utils::GetYAMLKeyValue( + const auto ip = husarion_ugv_utils::GetYAMLKeyValue(host, "ip"); + const auto username = husarion_ugv_utils::GetYAMLKeyValue(host, "username"); + const auto port = husarion_ugv_utils::GetYAMLKeyValue(host, "port", 22); + const auto command = husarion_ugv_utils::GetYAMLKeyValue( host, "command", "sudo shutdown now"); - const auto timeout = panther_utils::GetYAMLKeyValue(host, "timeout", 5.0); - const auto ping_for_success = panther_utils::GetYAMLKeyValue( + const auto timeout = husarion_ugv_utils::GetYAMLKeyValue(host, "timeout", 5.0); + const auto ping_for_success = husarion_ugv_utils::GetYAMLKeyValue( host, "ping_for_success", true); hosts.push_back( std::make_shared(ip, username, port, command, timeout, ping_for_success)); @@ -77,10 +77,10 @@ bool ShutdownHostsFromFile::UpdateHosts(std::vector("ShutdownHostsFromFile"); + factory.registerNodeType("ShutdownHostsFromFile"); } diff --git a/panther_manager/src/plugins/action/shutdown_single_host_node.cpp b/husarion_ugv_manager/src/plugins/action/shutdown_single_host_node.cpp similarity index 86% rename from panther_manager/src/plugins/action/shutdown_single_host_node.cpp rename to husarion_ugv_manager/src/plugins/action/shutdown_single_host_node.cpp index 5c4f7eae7..a2dbabb9a 100644 --- a/panther_manager/src/plugins/action/shutdown_single_host_node.cpp +++ b/husarion_ugv_manager/src/plugins/action/shutdown_single_host_node.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_manager/plugins/action/shutdown_single_host_node.hpp" +#include "husarion_ugv_manager/plugins/action/shutdown_single_host_node.hpp" #include #include @@ -21,10 +21,10 @@ #include "behaviortree_cpp/exceptions.h" #include "behaviortree_cpp/tree_node.h" -#include "panther_manager/behavior_tree_utils.hpp" -#include "panther_manager/plugins/shutdown_host.hpp" +#include "husarion_ugv_manager/behavior_tree_utils.hpp" +#include "husarion_ugv_manager/plugins/shutdown_host.hpp" -namespace panther_manager +namespace husarion_ugv_manager { bool ShutdownSingleHost::UpdateHosts(std::vector> & hosts) @@ -71,10 +71,10 @@ bool ShutdownSingleHost::UpdateHosts(std::vector> return true; } -} // namespace panther_manager +} // namespace husarion_ugv_manager #include "behaviortree_cpp/bt_factory.h" BT_REGISTER_NODES(factory) { - factory.registerNodeType("ShutdownSingleHost"); + factory.registerNodeType("ShutdownSingleHost"); } diff --git a/panther_manager/src/plugins/action/signal_shutdown_node.cpp b/husarion_ugv_manager/src/plugins/action/signal_shutdown_node.cpp similarity index 83% rename from panther_manager/src/plugins/action/signal_shutdown_node.cpp rename to husarion_ugv_manager/src/plugins/action/signal_shutdown_node.cpp index 8d674def0..d9a5fd028 100644 --- a/panther_manager/src/plugins/action/signal_shutdown_node.cpp +++ b/husarion_ugv_manager/src/plugins/action/signal_shutdown_node.cpp @@ -12,14 +12,14 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_manager/plugins/action/signal_shutdown_node.hpp" +#include "husarion_ugv_manager/plugins/action/signal_shutdown_node.hpp" #include #include #include "behaviortree_cpp/basic_types.h" -namespace panther_manager +namespace husarion_ugv_manager { BT::NodeStatus SignalShutdown::tick() @@ -34,10 +34,10 @@ BT::NodeStatus SignalShutdown::tick() return BT::NodeStatus::SUCCESS; } -} // namespace panther_manager +} // namespace husarion_ugv_manager #include "behaviortree_cpp/bt_factory.h" BT_REGISTER_NODES(factory) { - factory.registerNodeType("SignalShutdown"); + factory.registerNodeType("SignalShutdown"); } diff --git a/panther_manager/src/plugins/decorator/tick_after_timeout_node.cpp b/husarion_ugv_manager/src/plugins/decorator/tick_after_timeout_node.cpp similarity index 87% rename from panther_manager/src/plugins/decorator/tick_after_timeout_node.cpp rename to husarion_ugv_manager/src/plugins/decorator/tick_after_timeout_node.cpp index 8a746ec37..e89ebb9a9 100644 --- a/panther_manager/src/plugins/decorator/tick_after_timeout_node.cpp +++ b/husarion_ugv_manager/src/plugins/decorator/tick_after_timeout_node.cpp @@ -12,9 +12,9 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_manager/plugins/decorator/tick_after_timeout_node.hpp" +#include "husarion_ugv_manager/plugins/decorator/tick_after_timeout_node.hpp" -namespace panther_manager +namespace husarion_ugv_manager { TickAfterTimeout::TickAfterTimeout(const std::string & name, const BT::NodeConfig & conf) @@ -53,10 +53,10 @@ BT::NodeStatus TickAfterTimeout::tick() return child_status; } -} // namespace panther_manager +} // namespace husarion_ugv_manager #include "behaviortree_cpp/bt_factory.h" BT_REGISTER_NODES(factory) { - factory.registerNodeType("TickAfterTimeout"); + factory.registerNodeType("TickAfterTimeout"); } diff --git a/panther_manager/src/safety_manager_node.cpp b/husarion_ugv_manager/src/safety_manager_node.cpp similarity index 94% rename from panther_manager/src/safety_manager_node.cpp rename to husarion_ugv_manager/src/safety_manager_node.cpp index b05006845..424724c33 100644 --- a/panther_manager/src/safety_manager_node.cpp +++ b/husarion_ugv_manager/src/safety_manager_node.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_manager/safety_manager_node.hpp" +#include "husarion_ugv_manager/safety_manager_node.hpp" #include #include @@ -28,12 +28,12 @@ #include "behaviortree_ros2/ros_node_params.hpp" #include "rclcpp/rclcpp.hpp" -#include "panther_utils/moving_average.hpp" +#include "husarion_ugv_utils/moving_average.hpp" -#include -#include +#include +#include -namespace panther_manager +namespace husarion_ugv_manager { SafetyManagerNode::SafetyManagerNode( @@ -48,8 +48,8 @@ SafetyManagerNode::SafetyManagerNode( const auto cpu_temp_window_len = this->get_parameter("cpu.temp.window_len").as_int(); battery_temp_ma_ = - std::make_unique>(battery_temp_window_len); - cpu_temp_ma_ = std::make_unique>(cpu_temp_window_len); + std::make_unique>(battery_temp_window_len); + cpu_temp_ma_ = std::make_unique>(cpu_temp_window_len); const auto safety_initial_blackboard = CreateSafetyInitialBlackboard(); safety_tree_manager_ = std::make_unique( @@ -108,9 +108,9 @@ void SafetyManagerNode::Initialize() void SafetyManagerNode::DeclareParameters() { - const auto panther_manager_pkg_path = - ament_index_cpp::get_package_share_directory("panther_manager"); - const std::string default_bt_project_path = panther_manager_pkg_path + + const auto husarion_ugv_manager_pkg_path = + ament_index_cpp::get_package_share_directory("husarion_ugv_manager"); + const std::string default_bt_project_path = husarion_ugv_manager_pkg_path + "/behavior_trees/PantherSafetyBT.btproj"; const std::vector default_plugin_libs = {}; @@ -223,7 +223,7 @@ void SafetyManagerNode::RobotDriverStateCB(const RobotDriverStateMsg::SharedPtr this->get_logger(), "Creating moving average for driver '%s'", driver.name.c_str()); const auto driver_temp_window_len = this->get_parameter("driver.temp.window_len").as_int(); driver_temp_ma_[driver.name] = - std::make_unique>(driver_temp_window_len); + std::make_unique>(driver_temp_window_len); } driver_temp_ma_[driver.name]->Roll(driver.state.temperature); @@ -322,4 +322,4 @@ void SafetyManagerNode::ShutdownRobot(const std::string & reason) rclcpp::shutdown(); } -} // namespace panther_manager +} // namespace husarion_ugv_manager diff --git a/panther_manager/src/safety_manager_node_main.cpp b/husarion_ugv_manager/src/safety_manager_node_main.cpp similarity index 86% rename from panther_manager/src/safety_manager_node_main.cpp rename to husarion_ugv_manager/src/safety_manager_node_main.cpp index 3ad344048..68486c863 100644 --- a/panther_manager/src/safety_manager_node_main.cpp +++ b/husarion_ugv_manager/src/safety_manager_node_main.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "panther_manager/safety_manager_node.hpp" +#include "husarion_ugv_manager/safety_manager_node.hpp" #include #include @@ -22,7 +22,8 @@ int main(int argc, char ** argv) { rclcpp::init(argc, argv); - auto safety_manager_node = std::make_shared("safety_manager"); + auto safety_manager_node = + std::make_shared("safety_manager"); safety_manager_node->Initialize(); try { diff --git a/panther_manager/test/plugins/action/test_call_set_bool_service_node.cpp b/husarion_ugv_manager/test/plugins/action/test_call_set_bool_service_node.cpp similarity index 85% rename from panther_manager/test/plugins/action/test_call_set_bool_service_node.cpp rename to husarion_ugv_manager/test/plugins/action/test_call_set_bool_service_node.cpp index c9526698b..e359bc59d 100644 --- a/panther_manager/test/plugins/action/test_call_set_bool_service_node.cpp +++ b/husarion_ugv_manager/test/plugins/action/test_call_set_bool_service_node.cpp @@ -20,10 +20,10 @@ #include "behaviortree_cpp/bt_factory.h" #include "rclcpp/rclcpp.hpp" -#include "panther_manager/plugins/action/call_set_bool_service_node.hpp" +#include "husarion_ugv_manager/plugins/action/call_set_bool_service_node.hpp" #include "utils/plugin_test_utils.hpp" -class TestCallSetBoolService : public panther_manager::plugin_test_utils::PluginTestUtils +class TestCallSetBoolService : public husarion_ugv_manager::plugin_test_utils::PluginTestUtils { public: void ServiceCallback( @@ -47,7 +47,7 @@ TEST_F(TestCallSetBoolService, GoodLoadingCallSetBoolServicePlugin) { std::map service = {{"service_name", "set_bool"}, {"data", "true"}}; - RegisterNodeWithParams("CallSetBoolService"); + RegisterNodeWithParams("CallSetBoolService"); ASSERT_NO_THROW({ CreateTree("CallSetBoolService", service); }); } @@ -56,7 +56,7 @@ TEST_F(TestCallSetBoolService, WrongPluginNameLoadingCallSetBoolServicePlugin) { std::map service = {{"service_name", "set_bool"}, {"data", "true"}}; - RegisterNodeWithParams("CallSetBoolService"); + RegisterNodeWithParams("CallSetBoolService"); EXPECT_THROW({ CreateTree("WrongCallSetBoolService", service); }, BT::RuntimeError); } @@ -65,7 +65,7 @@ TEST_F(TestCallSetBoolService, WrongCallSetBoolServiceServiceServerNotInitialize { std::map service = {{"service_name", "set_bool"}, {"data", "true"}}; - RegisterNodeWithParams("CallSetBoolService"); + RegisterNodeWithParams("CallSetBoolService"); CreateTree("CallSetBoolService", service); @@ -86,7 +86,7 @@ TEST_F(TestCallSetBoolService, GoodSetBoolCallServiceSuccessWithTrueValue) ServiceCallback(request, response, true, true); }); - RegisterNodeWithParams("CallSetBoolService"); + RegisterNodeWithParams("CallSetBoolService"); CreateTree("CallSetBoolService", service); auto & tree = GetTree(); @@ -106,7 +106,7 @@ TEST_F(TestCallSetBoolService, GoodSetBoolCallServiceSuccessWithFalseValue) ServiceCallback(request, response, true, false); }); - RegisterNodeWithParams("CallSetBoolService"); + RegisterNodeWithParams("CallSetBoolService"); CreateTree("CallSetBoolService", service); auto & tree = GetTree(); @@ -126,7 +126,7 @@ TEST_F(TestCallSetBoolService, WrongSetBoolCallServiceFailure) ServiceCallback(request, response, false, false); }); - RegisterNodeWithParams("CallSetBoolService"); + RegisterNodeWithParams("CallSetBoolService"); CreateTree("CallSetBoolService", service); auto & tree = GetTree(); diff --git a/panther_manager/test/plugins/action/test_call_set_led_animation_service_node.cpp b/husarion_ugv_manager/test/plugins/action/test_call_set_led_animation_service_node.cpp similarity index 86% rename from panther_manager/test/plugins/action/test_call_set_led_animation_service_node.cpp rename to husarion_ugv_manager/test/plugins/action/test_call_set_led_animation_service_node.cpp index d44ff4ec3..1708ef7d1 100644 --- a/panther_manager/test/plugins/action/test_call_set_led_animation_service_node.cpp +++ b/husarion_ugv_manager/test/plugins/action/test_call_set_led_animation_service_node.cpp @@ -20,10 +20,11 @@ #include "behaviortree_cpp/bt_factory.h" #include "rclcpp/rclcpp.hpp" -#include "panther_manager/plugins/action/call_set_led_animation_service_node.hpp" +#include "husarion_ugv_manager/plugins/action/call_set_led_animation_service_node.hpp" #include "utils/plugin_test_utils.hpp" -class TestCallSetLedAnimationService : public panther_manager::plugin_test_utils::PluginTestUtils +class TestCallSetLedAnimationService +: public husarion_ugv_manager::plugin_test_utils::PluginTestUtils { public: void ServiceCallback( @@ -54,7 +55,8 @@ TEST_F(TestCallSetLedAnimationService, GoodLoadingCallSetLedAnimationServicePlug std::map service = { {"service_name", "set_led_animation"}, {"id", "0"}, {"param", ""}, {"repeating", "true"}}; - RegisterNodeWithParams("CallSetLedAnimationService"); + RegisterNodeWithParams( + "CallSetLedAnimationService"); ASSERT_NO_THROW({ CreateTree("CallSetLedAnimationService", service); }); } @@ -64,7 +66,8 @@ TEST_F(TestCallSetLedAnimationService, WrongPluginNameLoadingCallSetLedAnimation std::map service = { {"service_name", "set_led_animation"}, {"id", "0"}, {"param", ""}, {"repeating", "true"}}; - RegisterNodeWithParams("CallSetLedAnimationService"); + RegisterNodeWithParams( + "CallSetLedAnimationService"); EXPECT_THROW({ CreateTree("WrongCallSetLedAnimationService", service); }, BT::RuntimeError); } @@ -74,7 +77,8 @@ TEST_F(TestCallSetLedAnimationService, WrongCallSetLedAnimationServiceServiceSer std::map service = { {"service_name", "set_led_animation"}, {"id", "0"}, {"param", ""}, {"repeating", "true"}}; - RegisterNodeWithParams("CallSetLedAnimationService"); + RegisterNodeWithParams( + "CallSetLedAnimationService"); CreateTree("CallSetLedAnimationService", service); auto & tree = GetTree(); @@ -88,7 +92,8 @@ TEST_F(TestCallSetLedAnimationService, GoodSetLedAnimationCallServiceSuccessWith std::map service = { {"service_name", "set_led_animation"}, {"id", "0"}, {"param", ""}, {"repeating", "true"}}; - RegisterNodeWithParams("CallSetLedAnimationService"); + RegisterNodeWithParams( + "CallSetLedAnimationService"); CreateTree("CallSetLedAnimationService", service); auto & tree = GetTree(); @@ -110,7 +115,8 @@ TEST_F(TestCallSetLedAnimationService, GoodSetLedAnimationCallServiceSuccessWith std::map service = { {"service_name", "set_led_animation"}, {"id", "0"}, {"param", ""}, {"repeating", "false"}}; - RegisterNodeWithParams("CallSetLedAnimationService"); + RegisterNodeWithParams( + "CallSetLedAnimationService"); CreateTree("CallSetLedAnimationService", service); auto & tree = GetTree(); @@ -132,7 +138,8 @@ TEST_F(TestCallSetLedAnimationService, GoodSetLedAnimationCallServiceSuccessWith std::map service = { {"service_name", "set_led_animation"}, {"id", "5"}, {"param", ""}, {"repeating", "true"}}; - RegisterNodeWithParams("CallSetLedAnimationService"); + RegisterNodeWithParams( + "CallSetLedAnimationService"); CreateTree("CallSetLedAnimationService", service); auto & tree = GetTree(); @@ -154,7 +161,8 @@ TEST_F(TestCallSetLedAnimationService, WrongSetLedAnimationCallServiceFailure) std::map service = { {"service_name", "set_led_animation"}, {"id", "0"}, {"param", ""}, {"repeating", "true"}}; - RegisterNodeWithParams("CallSetLedAnimationService"); + RegisterNodeWithParams( + "CallSetLedAnimationService"); CreateTree("CallSetLedAnimationService", service); auto & tree = GetTree(); diff --git a/panther_manager/test/plugins/action/test_call_trigger_service_node.cpp b/husarion_ugv_manager/test/plugins/action/test_call_trigger_service_node.cpp similarity index 84% rename from panther_manager/test/plugins/action/test_call_trigger_service_node.cpp rename to husarion_ugv_manager/test/plugins/action/test_call_trigger_service_node.cpp index e0aa30502..a130e5308 100644 --- a/panther_manager/test/plugins/action/test_call_trigger_service_node.cpp +++ b/husarion_ugv_manager/test/plugins/action/test_call_trigger_service_node.cpp @@ -21,10 +21,10 @@ #include "behaviortree_cpp/bt_factory.h" #include "rclcpp/rclcpp.hpp" -#include "panther_manager/plugins/action/call_trigger_service_node.hpp" +#include "husarion_ugv_manager/plugins/action/call_trigger_service_node.hpp" #include "utils/plugin_test_utils.hpp" -class TestCallTriggerService : public panther_manager::plugin_test_utils::PluginTestUtils +class TestCallTriggerService : public husarion_ugv_manager::plugin_test_utils::PluginTestUtils { public: void ServiceCallback( @@ -45,7 +45,7 @@ TEST_F(TestCallTriggerService, GoodLoadingCallTriggerServicePlugin) { std::map service = {{"service_name", "trigger"}}; - RegisterNodeWithParams("CallTriggerService"); + RegisterNodeWithParams("CallTriggerService"); ASSERT_NO_THROW({ CreateTree("CallTriggerService", service); }); } @@ -54,7 +54,7 @@ TEST_F(TestCallTriggerService, WrongPluginNameLoadingCallTriggerServicePlugin) { std::map service = {{"service_name", "trigger"}}; - RegisterNodeWithParams("CallTriggerService"); + RegisterNodeWithParams("CallTriggerService"); EXPECT_THROW({ CreateTree("WrongCallTriggerService", service); }, BT::RuntimeError); } @@ -63,7 +63,7 @@ TEST_F(TestCallTriggerService, WrongCallTriggerServiceServiceServerNotInitialize { std::map service = {{"service_name", "trigger"}}; - RegisterNodeWithParams("CallTriggerService"); + RegisterNodeWithParams("CallTriggerService"); CreateTree("CallTriggerService", service); auto & tree = GetTree(); @@ -76,7 +76,7 @@ TEST_F(TestCallTriggerService, GoodTriggerCallServiceSuccess) { std::map service = {{"service_name", "trigger"}}; - RegisterNodeWithParams("CallTriggerService"); + RegisterNodeWithParams("CallTriggerService"); CreateTree("CallTriggerService", service); auto & tree = GetTree(); @@ -97,7 +97,7 @@ TEST_F(TestCallTriggerService, WrongTriggerCallServiceFailure) { std::map service = {{"service_name", "trigger"}}; - RegisterNodeWithParams("CallTriggerService"); + RegisterNodeWithParams("CallTriggerService"); CreateTree("CallTriggerService", service); auto & tree = GetTree(); diff --git a/panther_manager/test/plugins/action/test_shutdown_hosts_from_file_node.cpp b/husarion_ugv_manager/test/plugins/action/test_shutdown_hosts_from_file_node.cpp similarity index 77% rename from panther_manager/test/plugins/action/test_shutdown_hosts_from_file_node.cpp rename to husarion_ugv_manager/test/plugins/action/test_shutdown_hosts_from_file_node.cpp index edece3f66..980f9e0af 100644 --- a/panther_manager/test/plugins/action/test_shutdown_hosts_from_file_node.cpp +++ b/husarion_ugv_manager/test/plugins/action/test_shutdown_hosts_from_file_node.cpp @@ -22,16 +22,16 @@ #include "behaviortree_cpp/bt_factory.h" #include "rclcpp/rclcpp.hpp" -#include "panther_manager/plugins/action/shutdown_hosts_from_file_node.hpp" +#include "husarion_ugv_manager/plugins/action/shutdown_hosts_from_file_node.hpp" #include "utils/plugin_test_utils.hpp" -typedef panther_manager::plugin_test_utils::PluginTestUtils TestShutdownHostsFromFile; +typedef husarion_ugv_manager::plugin_test_utils::PluginTestUtils TestShutdownHostsFromFile; TEST_F(TestShutdownHostsFromFile, GoodLoadingShutdownHostsFromFilePlugin) { const std::map service = {{"shutdown_hosts_file", "dummy_file"}}; - RegisterNodeWithoutParams("ShutdownHostsFromFile"); + RegisterNodeWithoutParams("ShutdownHostsFromFile"); ASSERT_NO_THROW({ CreateTree("ShutdownHostsFromFile", service); }); } @@ -40,7 +40,7 @@ TEST_F(TestShutdownHostsFromFile, WrongPluginNameLoadingShutdownHostsFromFilePlu { const std::map service = {{"shutdown_hosts_file", "dummy_file"}}; - RegisterNodeWithoutParams("ShutdownHostsFromFile"); + RegisterNodeWithoutParams("ShutdownHostsFromFile"); EXPECT_THROW({ CreateTree("WrongShutdownHostsFromFile", service); }, BT::RuntimeError); } @@ -48,10 +48,11 @@ TEST_F(TestShutdownHostsFromFile, WrongPluginNameLoadingShutdownHostsFromFilePlu TEST_F(TestShutdownHostsFromFile, WrongCannotFindFileShutdownHostsFromFile) { const std::string file_path = - testing::TempDir() + "test_panther_manager_wrong_cannot_find_file_shutdown_hosts_from_file"; + testing::TempDir() + + "test_husarion_ugv_manager_wrong_cannot_find_file_shutdown_hosts_from_file"; const std::map service = {{"shutdown_hosts_file", file_path}}; - RegisterNodeWithoutParams("ShutdownHostsFromFile"); + RegisterNodeWithoutParams("ShutdownHostsFromFile"); CreateTree("ShutdownHostsFromFile", service); auto & tree = GetTree(); @@ -62,10 +63,10 @@ TEST_F(TestShutdownHostsFromFile, WrongCannotFindFileShutdownHostsFromFile) TEST_F(TestShutdownHostsFromFile, GoodShutdownHostsFromFile) { - const std::string config_file_path = testing::TempDir() + - "test_panther_manager_good_shutdown_hosts_from_file_config"; + const std::string config_file_path = + testing::TempDir() + "test_husarion_ugv_manager_good_shutdown_hosts_from_file_config"; const std::string test_file_path = testing::TempDir() + - "test_panther_manager_good_shutdown_hosts_from_file"; + "test_husarion_ugv_manager_good_shutdown_hosts_from_file"; std::filesystem::remove(test_file_path); std::filesystem::remove(config_file_path); @@ -89,7 +90,7 @@ TEST_F(TestShutdownHostsFromFile, GoodShutdownHostsFromFile) config_file.close(); const std::map service = {{"shutdown_hosts_file", config_file_path}}; - RegisterNodeWithoutParams("ShutdownHostsFromFile"); + RegisterNodeWithoutParams("ShutdownHostsFromFile"); auto & tree = GetTree(); CreateTree("ShutdownHostsFromFile", service); diff --git a/panther_manager/test/plugins/action/test_shutdown_single_host_node.cpp b/husarion_ugv_manager/test/plugins/action/test_shutdown_single_host_node.cpp similarity index 81% rename from panther_manager/test/plugins/action/test_shutdown_single_host_node.cpp rename to husarion_ugv_manager/test/plugins/action/test_shutdown_single_host_node.cpp index b174b7dc7..5ed922dc9 100644 --- a/panther_manager/test/plugins/action/test_shutdown_single_host_node.cpp +++ b/husarion_ugv_manager/test/plugins/action/test_shutdown_single_host_node.cpp @@ -22,10 +22,10 @@ #include "behaviortree_cpp/bt_factory.h" #include "rclcpp/rclcpp.hpp" -#include "panther_manager/plugins/action/shutdown_single_host_node.hpp" +#include "husarion_ugv_manager/plugins/action/shutdown_single_host_node.hpp" #include "utils/plugin_test_utils.hpp" -typedef panther_manager::plugin_test_utils::PluginTestUtils TestShutdownSingleHost; +typedef husarion_ugv_manager::plugin_test_utils::PluginTestUtils TestShutdownSingleHost; TEST_F(TestShutdownSingleHost, GoodLoadingShutdownSingleHostPlugin) { @@ -34,7 +34,7 @@ TEST_F(TestShutdownSingleHost, GoodLoadingShutdownSingleHostPlugin) {"port", "22"}, {"timeout", "5.0"}, {"username", "husarion"}, }; - RegisterNodeWithoutParams("ShutdownSingleHost"); + RegisterNodeWithoutParams("ShutdownSingleHost"); ASSERT_NO_THROW({ CreateTree("ShutdownSingleHost", service); }); } @@ -46,13 +46,13 @@ TEST_F(TestShutdownSingleHost, WrongPluginNameLoadingShutdownSingleHostPlugin) {"port", "22"}, {"timeout", "5.0"}, {"username", "husarion"}, }; - RegisterNodeWithoutParams("ShutdownSingleHost"); + RegisterNodeWithoutParams("ShutdownSingleHost"); EXPECT_THROW({ CreateTree("WrongShutdownSingleHost", service); }, BT::RuntimeError); } TEST_F(TestShutdownSingleHost, GoodTouchCommand) { - std::string test_file_path = testing::TempDir() + "test_panther_manager_good_touch_command"; + std::string test_file_path = testing::TempDir() + "test_husarion_ugv_manager_good_touch_command"; std::filesystem::remove(test_file_path); EXPECT_FALSE(std::filesystem::exists(test_file_path)); std::map service = { @@ -63,7 +63,7 @@ TEST_F(TestShutdownSingleHost, GoodTouchCommand) {"timeout", "5.0"}, {"username", "husarion"}, }; - RegisterNodeWithoutParams("ShutdownSingleHost"); + RegisterNodeWithoutParams("ShutdownSingleHost"); CreateTree("ShutdownSingleHost", service); auto & tree = GetTree(); @@ -80,7 +80,7 @@ TEST_F(TestShutdownSingleHost, Timeout) {"command", "sleep 0.5"}, {"ip", "localhost"}, {"ping_for_success", "false"}, {"port", "22"}, {"timeout", "0.1"}, {"username", "husarion"}, }; - RegisterNodeWithoutParams("ShutdownSingleHost"); + RegisterNodeWithoutParams("ShutdownSingleHost"); CreateTree("ShutdownSingleHost", service); auto & tree = GetTree(); @@ -98,7 +98,7 @@ TEST_F(TestShutdownSingleHost, WrongUser) {"timeout", "0.2"}, {"username", "wrong_user"}, }; - RegisterNodeWithoutParams("ShutdownSingleHost"); + RegisterNodeWithoutParams("ShutdownSingleHost"); CreateTree("ShutdownSingleHost", service); auto & tree = GetTree(); diff --git a/panther_manager/test/plugins/action/test_signal_shutdown_node.cpp b/husarion_ugv_manager/test/plugins/action/test_signal_shutdown_node.cpp similarity index 85% rename from panther_manager/test/plugins/action/test_signal_shutdown_node.cpp rename to husarion_ugv_manager/test/plugins/action/test_signal_shutdown_node.cpp index 9fd109c27..3b0a383b9 100644 --- a/panther_manager/test/plugins/action/test_signal_shutdown_node.cpp +++ b/husarion_ugv_manager/test/plugins/action/test_signal_shutdown_node.cpp @@ -21,16 +21,16 @@ #include "behaviortree_cpp/bt_factory.h" #include "rclcpp/rclcpp.hpp" -#include "panther_manager/plugins/action/signal_shutdown_node.hpp" +#include "husarion_ugv_manager/plugins/action/signal_shutdown_node.hpp" #include "utils/plugin_test_utils.hpp" -typedef panther_manager::plugin_test_utils::PluginTestUtils TestSignalShutdown; +typedef husarion_ugv_manager::plugin_test_utils::PluginTestUtils TestSignalShutdown; TEST_F(TestSignalShutdown, GoodLoadingSignalShutdownPlugin) { std::map service = {{"reason", "Test shutdown."}}; - RegisterNodeWithoutParams("SignalShutdown"); + RegisterNodeWithoutParams("SignalShutdown"); ASSERT_NO_THROW({ CreateTree("SignalShutdown", service); }); } @@ -46,7 +46,7 @@ TEST_F(TestSignalShutdown, GoodCheckReasonBlackboardValue) { std::map service = {{"reason", "Test shutdown."}}; - RegisterNodeWithoutParams("SignalShutdown"); + RegisterNodeWithoutParams("SignalShutdown"); CreateTree("SignalShutdown", service); auto & tree = GetTree(); diff --git a/panther_manager/test/plugins/decorator/test_tick_after_timeout_node.cpp b/husarion_ugv_manager/test/plugins/decorator/test_tick_after_timeout_node.cpp similarity index 89% rename from panther_manager/test/plugins/decorator/test_tick_after_timeout_node.cpp rename to husarion_ugv_manager/test/plugins/decorator/test_tick_after_timeout_node.cpp index deba7db91..fb2eca460 100644 --- a/panther_manager/test/plugins/decorator/test_tick_after_timeout_node.cpp +++ b/husarion_ugv_manager/test/plugins/decorator/test_tick_after_timeout_node.cpp @@ -21,10 +21,10 @@ #include "behaviortree_cpp/bt_factory.h" #include "rclcpp/rclcpp.hpp" -#include "panther_manager/plugins/decorator/tick_after_timeout_node.hpp" +#include "husarion_ugv_manager/plugins/decorator/tick_after_timeout_node.hpp" #include "utils/plugin_test_utils.hpp" -class TestTickAfterTimeout : public panther_manager::plugin_test_utils::PluginTestUtils +class TestTickAfterTimeout : public husarion_ugv_manager::plugin_test_utils::PluginTestUtils { public: virtual std::string BuildBehaviorTree( @@ -51,7 +51,7 @@ std::string TestTickAfterTimeout::BuildBehaviorTree( TEST_F(TestTickAfterTimeout, GoodTickAfterTimeout) { - RegisterNodeWithoutParams("TickAfterTimeout"); + RegisterNodeWithoutParams("TickAfterTimeout"); CreateTree("", {}); auto & tree = GetTree(); diff --git a/panther_manager/test/plugins/test_shutdown_host.cpp b/husarion_ugv_manager/test/plugins/test_shutdown_host.cpp similarity index 64% rename from panther_manager/test/plugins/test_shutdown_host.cpp rename to husarion_ugv_manager/test/plugins/test_shutdown_host.cpp index 25317ee56..cd48e27d6 100644 --- a/panther_manager/test/plugins/test_shutdown_host.cpp +++ b/husarion_ugv_manager/test/plugins/test_shutdown_host.cpp @@ -16,7 +16,7 @@ #include "gtest/gtest.h" -#include "panther_manager/plugins/shutdown_host.hpp" +#include "husarion_ugv_manager/plugins/shutdown_host.hpp" class TestShutdownHost : public testing::Test { @@ -26,18 +26,18 @@ class TestShutdownHost : public testing::Test const float timeout, const bool ping_for_success); bool IsAvailable(); void Call(); - panther_manager::ShutdownHostState GetState() const; + husarion_ugv_manager::ShutdownHostState GetState() const; std::string GetResponse() const; private: - std::unique_ptr shutdown_host; + std::unique_ptr shutdown_host; }; void TestShutdownHost::Create( const std::string ip, const std::string user, const int port, const std::string command, const float timeout, const bool ping_for_success) { - shutdown_host = std::make_unique( + shutdown_host = std::make_unique( ip, user, port, command, timeout, ping_for_success); } @@ -45,7 +45,7 @@ bool TestShutdownHost::IsAvailable() { return shutdown_host->IsAvailable(); } void TestShutdownHost::Call() { shutdown_host->Call(); } -panther_manager::ShutdownHostState TestShutdownHost::GetState() const +husarion_ugv_manager::ShutdownHostState TestShutdownHost::GetState() const { return shutdown_host->GetState(); } @@ -56,7 +56,7 @@ TEST_F(TestShutdownHost, GoodCheckIsAvailable) { Create("127.0.0.1", "husarion", 22, "echo HelloWorld", 0.1, true); EXPECT_TRUE(IsAvailable()); - EXPECT_EQ(GetState(), panther_manager::ShutdownHostState::IDLE); + EXPECT_EQ(GetState(), husarion_ugv_manager::ShutdownHostState::IDLE); } TEST_F(TestShutdownHost, WrongCheckIsAvailable) @@ -70,32 +70,32 @@ TEST_F(TestShutdownHost, GoodCommandExecute) Create("127.0.0.1", "husarion", 22, "echo HelloWorld", 0.1, false); ASSERT_TRUE(IsAvailable()); - ASSERT_EQ(GetState(), panther_manager::ShutdownHostState::IDLE); + ASSERT_EQ(GetState(), husarion_ugv_manager::ShutdownHostState::IDLE); Call(); - ASSERT_EQ(GetState(), panther_manager::ShutdownHostState::COMMAND_EXECUTED); + ASSERT_EQ(GetState(), husarion_ugv_manager::ShutdownHostState::COMMAND_EXECUTED); // Wait for response - while (GetState() == panther_manager::ShutdownHostState::COMMAND_EXECUTED) { + while (GetState() == husarion_ugv_manager::ShutdownHostState::COMMAND_EXECUTED) { Call(); } - ASSERT_EQ(GetState(), panther_manager::ShutdownHostState::RESPONSE_RECEIVED); + ASSERT_EQ(GetState(), husarion_ugv_manager::ShutdownHostState::RESPONSE_RECEIVED); const auto response = GetResponse(); EXPECT_EQ(response, "HelloWorld\n"); Call(); - ASSERT_EQ(GetState(), panther_manager::ShutdownHostState::PINGING); + ASSERT_EQ(GetState(), husarion_ugv_manager::ShutdownHostState::PINGING); Call(); - ASSERT_EQ(GetState(), panther_manager::ShutdownHostState::SUCCESS); + ASSERT_EQ(GetState(), husarion_ugv_manager::ShutdownHostState::SUCCESS); } TEST_F(TestShutdownHost, WrongHostPing) { Create("1.45.23.26", "husarion", 22, "echo HelloWorld", 0.1, true); - EXPECT_EQ(GetState(), panther_manager::ShutdownHostState::IDLE); + EXPECT_EQ(GetState(), husarion_ugv_manager::ShutdownHostState::IDLE); Call(); - EXPECT_EQ(GetState(), panther_manager::ShutdownHostState::SKIPPED); + EXPECT_EQ(GetState(), husarion_ugv_manager::ShutdownHostState::SKIPPED); } TEST_F(TestShutdownHost, CheckTimeout) @@ -103,14 +103,14 @@ TEST_F(TestShutdownHost, CheckTimeout) Create("127.0.0.1", "husarion", 22, "sleep 0.2", 0.1, false); ASSERT_TRUE(IsAvailable()); - ASSERT_EQ(GetState(), panther_manager::ShutdownHostState::IDLE); + ASSERT_EQ(GetState(), husarion_ugv_manager::ShutdownHostState::IDLE); Call(); - ASSERT_EQ(GetState(), panther_manager::ShutdownHostState::COMMAND_EXECUTED); + ASSERT_EQ(GetState(), husarion_ugv_manager::ShutdownHostState::COMMAND_EXECUTED); // Wait for response - while (GetState() == panther_manager::ShutdownHostState::COMMAND_EXECUTED) { + while (GetState() == husarion_ugv_manager::ShutdownHostState::COMMAND_EXECUTED) { Call(); } - ASSERT_EQ(GetState(), panther_manager::ShutdownHostState::FAILURE); + ASSERT_EQ(GetState(), husarion_ugv_manager::ShutdownHostState::FAILURE); } int main(int argc, char ** argv) diff --git a/panther_manager/test/plugins/test_shutdown_hosts_node.cpp b/husarion_ugv_manager/test/plugins/test_shutdown_hosts_node.cpp similarity index 63% rename from panther_manager/test/plugins/test_shutdown_hosts_node.cpp rename to husarion_ugv_manager/test/plugins/test_shutdown_hosts_node.cpp index 1395f4390..eb7971107 100644 --- a/panther_manager/test/plugins/test_shutdown_hosts_node.cpp +++ b/husarion_ugv_manager/test/plugins/test_shutdown_hosts_node.cpp @@ -16,24 +16,26 @@ #include "gtest/gtest.h" -#include "panther_manager/plugins/shutdown_hosts_node.hpp" +#include "husarion_ugv_manager/plugins/shutdown_hosts_node.hpp" -class ShutdownHostsNodeWrapper : public panther_manager::ShutdownHosts +class ShutdownHostsNodeWrapper : public husarion_ugv_manager::ShutdownHosts { public: ShutdownHostsNodeWrapper(const std::string & name, const BT::NodeConfig & conf) - : panther_manager::ShutdownHosts(name, conf) + : husarion_ugv_manager::ShutdownHosts(name, conf) { } - void RemoveDuplicatedHosts(std::vector> & hosts); - std::vector> & GetHosts(); + void RemoveDuplicatedHosts( + std::vector> & hosts); + std::vector> & GetHosts(); BT::NodeStatus onRunning(); BT::NodeStatus onStart(); virtual bool UpdateHosts( - std::vector> & hosts) override final; + std::vector> & hosts) override final; void SetHostsAndSuccess( - std::vector> hosts, const bool returned_status); + std::vector> hosts, + const bool returned_status); static BT::PortsList providedPorts() { @@ -43,40 +45,42 @@ class ShutdownHostsNodeWrapper : public panther_manager::ShutdownHosts } private: - std::vector> hosts_to_set; + std::vector> hosts_to_set; bool update_hosts_success_ = true; }; void ShutdownHostsNodeWrapper::RemoveDuplicatedHosts( - std::vector> & hosts) + std::vector> & hosts) { - panther_manager::ShutdownHosts::RemoveDuplicatedHosts(hosts); + husarion_ugv_manager::ShutdownHosts::RemoveDuplicatedHosts(hosts); } -std::vector> & ShutdownHostsNodeWrapper::GetHosts() +std::vector> & +ShutdownHostsNodeWrapper::GetHosts() { return hosts_; } BT::NodeStatus ShutdownHostsNodeWrapper::onRunning() { - return panther_manager::ShutdownHosts::onRunning(); + return husarion_ugv_manager::ShutdownHosts::onRunning(); } BT::NodeStatus ShutdownHostsNodeWrapper::onStart() { - return panther_manager::ShutdownHosts::onStart(); + return husarion_ugv_manager::ShutdownHosts::onStart(); } bool ShutdownHostsNodeWrapper::UpdateHosts( - std::vector> & hosts) + std::vector> & hosts) { hosts = hosts_to_set; return update_hosts_success_; } void ShutdownHostsNodeWrapper::SetHostsAndSuccess( - std::vector> hosts, const bool returned_status) + std::vector> hosts, + const bool returned_status) { hosts_to_set = hosts; update_hosts_success_ = returned_status; @@ -86,14 +90,14 @@ class ShutdownHostsNodeTest : public testing::Test { public: void CreateWrapper( - std::vector> hosts, const bool success); + std::vector> hosts, const bool success); protected: std::unique_ptr wrapper; }; void ShutdownHostsNodeTest::CreateWrapper( - std::vector> hosts, const bool success) + std::vector> hosts, const bool success) { BT::NodeConfig conf; wrapper = std::make_unique("Duplicated hosts", conf); @@ -103,14 +107,14 @@ void ShutdownHostsNodeTest::CreateWrapper( TEST_F(ShutdownHostsNodeTest, GoodRemovingDuplicatedHosts) { CreateWrapper( - {std::make_shared( + {std::make_shared( "127.0.0.1", "husarion", 22, "echo HelloWorld", 1.0, true), - std::make_shared( + std::make_shared( "localhost", "husarion", 22, "echo HelloWorld", 1.0, true), - std::make_shared( + std::make_shared( "localhost", "husarion", 22, "echo HelloWorld", 1.0, true)}, true); - std::vector> hosts; + std::vector> hosts; ASSERT_TRUE(wrapper->UpdateHosts(hosts)); ASSERT_EQ(hosts.size(), 3); wrapper->RemoveDuplicatedHosts(hosts); @@ -120,7 +124,7 @@ TEST_F(ShutdownHostsNodeTest, GoodRemovingDuplicatedHosts) TEST_F(ShutdownHostsNodeTest, FailedWhenUpdateHostReturnsFalse) { CreateWrapper( - {std::make_shared( + {std::make_shared( "127.0.0.1", "husarion", 22, "echo HelloWorld", 1.0, true)}, false); @@ -139,7 +143,7 @@ TEST_F(ShutdownHostsNodeTest, FailedWhenHostsAreEmpty) TEST_F(ShutdownHostsNodeTest, CheckFailedHosts) { CreateWrapper( - {std::make_shared( + {std::make_shared( "127.0.0.1", "husarion", 22, "echo HelloWorld", 1.0, true)}, true); auto status = wrapper->onStart(); diff --git a/panther_manager/test/test_behavior_tree_manager.cpp b/husarion_ugv_manager/test/test_behavior_tree_manager.cpp similarity index 91% rename from panther_manager/test/test_behavior_tree_manager.cpp rename to husarion_ugv_manager/test/test_behavior_tree_manager.cpp index ca6925e27..80807d0e9 100644 --- a/panther_manager/test/test_behavior_tree_manager.cpp +++ b/husarion_ugv_manager/test/test_behavior_tree_manager.cpp @@ -25,10 +25,10 @@ #include "behaviortree_cpp/tree_node.h" #include "rclcpp/rclcpp.hpp" -#include "panther_manager/behavior_tree_manager.hpp" -#include "panther_utils/test/test_utils.hpp" +#include "husarion_ugv_manager/behavior_tree_manager.hpp" +#include "husarion_ugv_utils/test/test_utils.hpp" -class BehaviorTreeManagerWrapper : public panther_manager::BehaviorTreeManager +class BehaviorTreeManagerWrapper : public husarion_ugv_manager::BehaviorTreeManager { public: BehaviorTreeManagerWrapper( @@ -69,7 +69,7 @@ TEST_F(TestBehaviorTreeManager, CreateBTConfigInvalidItem) { const std::map bb_values = {{"value", 1l}}; - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( [&]() { behavior_tree_manager_->CreateBTConfig(bb_values); }, "Invalid type for blackboard entry.")); } @@ -109,7 +109,7 @@ TEST_F(TestBehaviorTreeManager, InitializeInvalidTreeName) )"; ASSERT_NO_THROW(factory_.registerBehaviorTreeFromText(tree_xml)); - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( [&]() { behavior_tree_manager_->Initialize(factory_); }, "Can't find a tree with name: " + std::string(kTreeName))); } diff --git a/panther_manager/test/test_behavior_tree_utils.cpp b/husarion_ugv_manager/test/test_behavior_tree_utils.cpp similarity index 90% rename from panther_manager/test/test_behavior_tree_utils.cpp rename to husarion_ugv_manager/test/test_behavior_tree_utils.cpp index 75b0cb0a4..ac32b59e3 100644 --- a/panther_manager/test/test_behavior_tree_utils.cpp +++ b/husarion_ugv_manager/test/test_behavior_tree_utils.cpp @@ -26,8 +26,8 @@ #include "behaviortree_ros2/ros_node_params.hpp" #include "rclcpp/rclcpp.hpp" -#include "panther_manager/behavior_tree_utils.hpp" -#include "panther_utils/test/test_utils.hpp" +#include "husarion_ugv_manager/behavior_tree_utils.hpp" +#include "husarion_ugv_utils/test/test_utils.hpp" class TestRegisterBT : public testing::Test { @@ -74,7 +74,7 @@ TEST_F(TestRegisterBT, RegisterBehaviorTreeInvalidPlugin) BT::BehaviorTreeFactory factory; EXPECT_THROW( - panther_manager::behavior_tree_utils::RegisterBehaviorTree( + husarion_ugv_manager::behavior_tree_utils::RegisterBehaviorTree( factory, bt_project_path_, {"invalid_bt_node"}), BT::RuntimeError); } @@ -83,7 +83,7 @@ TEST_F(TestRegisterBT, RegisterBehaviorTree) { BT::BehaviorTreeFactory factory; - EXPECT_NO_THROW(panther_manager::behavior_tree_utils::RegisterBehaviorTree( + EXPECT_NO_THROW(husarion_ugv_manager::behavior_tree_utils::RegisterBehaviorTree( factory, bt_project_path_, {"tick_after_timeout_bt_node", "signal_shutdown_bt_node"})); // check if nodes were registered @@ -105,7 +105,7 @@ TEST_F(TestRegisterBT, RegisterBehaviorTreeROS) BT::RosNodeParams params; params.nh = std::make_shared("test_node"); - EXPECT_NO_THROW(panther_manager::behavior_tree_utils::RegisterBehaviorTree( + EXPECT_NO_THROW(husarion_ugv_manager::behavior_tree_utils::RegisterBehaviorTree( factory, bt_project_path_, {}, params, {"call_trigger_service_bt_node", "call_set_bool_service_bt_node"})); diff --git a/panther_manager/test/test_lights_behavior_tree.cpp b/husarion_ugv_manager/test/test_lights_behavior_tree.cpp similarity index 98% rename from panther_manager/test/test_lights_behavior_tree.cpp rename to husarion_ugv_manager/test/test_lights_behavior_tree.cpp index e96bce136..4a9f342d5 100644 --- a/panther_manager/test/test_lights_behavior_tree.cpp +++ b/husarion_ugv_manager/test/test_lights_behavior_tree.cpp @@ -31,7 +31,7 @@ #include "panther_msgs/msg/led_animation.hpp" #include "panther_msgs/srv/set_led_animation.hpp" -#include +#include #include using BoolMsg = std_msgs::msg::Bool; @@ -39,7 +39,7 @@ using BatteryStateMsg = sensor_msgs::msg::BatteryState; using SetLEDAnimationSrv = panther_msgs::srv::SetLEDAnimation; using LEDAnimationMsg = panther_msgs::msg::LEDAnimation; -class LightsManagerNodeWrapper : public panther_manager::LightsManagerNode +class LightsManagerNodeWrapper : public husarion_ugv_manager::LightsManagerNode { public: LightsManagerNodeWrapper( diff --git a/panther_manager/test/test_lights_manager_node.cpp b/husarion_ugv_manager/test/test_lights_manager_node.cpp similarity index 94% rename from panther_manager/test/test_lights_manager_node.cpp rename to husarion_ugv_manager/test/test_lights_manager_node.cpp index ea60e5296..cb3ef5b02 100644 --- a/panther_manager/test/test_lights_manager_node.cpp +++ b/husarion_ugv_manager/test/test_lights_manager_node.cpp @@ -29,13 +29,13 @@ #include "sensor_msgs/msg/battery_state.hpp" #include "std_msgs/msg/bool.hpp" -#include -#include "panther_utils/test/ros_test_utils.hpp" +#include +#include "husarion_ugv_utils/test/ros_test_utils.hpp" using BoolMsg = std_msgs::msg::Bool; using BatteryStateMsg = sensor_msgs::msg::BatteryState; -class LightsManagerNodeWrapper : public panther_manager::LightsManagerNode +class LightsManagerNodeWrapper : public husarion_ugv_manager::LightsManagerNode { public: LightsManagerNodeWrapper( @@ -146,7 +146,7 @@ TEST_F(TestLightsManagerNode, BatteryCBBlackboardUpdate) battery_state.power_supply_status = expected_status; battery_state.power_supply_health = expected_health; - panther_utils::test_utils::PublishAndSpin( + husarion_ugv_utils::test_utils::PublishAndSpin( lights_manager_node_, "battery/battery_status", battery_state); auto blackboard = lights_manager_node_->GetLightsTreeBlackboard(); @@ -162,7 +162,7 @@ TEST_F(TestLightsManagerNode, EStopCBBlackboardUpdate) auto bool_msg = std_msgs::msg::Bool(); bool_msg.data = expected_state; - panther_utils::test_utils::PublishAndSpin( + husarion_ugv_utils::test_utils::PublishAndSpin( lights_manager_node_, "hardware/e_stop", bool_msg, rclcpp::QoS(rclcpp::KeepLast(1)).transient_local().reliable()); diff --git a/panther_manager/test/test_safety_behavior_tree.cpp b/husarion_ugv_manager/test/test_safety_behavior_tree.cpp similarity index 98% rename from panther_manager/test/test_safety_behavior_tree.cpp rename to husarion_ugv_manager/test/test_safety_behavior_tree.cpp index 50a93343f..6f9540bfd 100644 --- a/panther_manager/test/test_safety_behavior_tree.cpp +++ b/husarion_ugv_manager/test/test_safety_behavior_tree.cpp @@ -33,7 +33,7 @@ #include "panther_msgs/msg/io_state.hpp" #include "panther_msgs/msg/system_status.hpp" -#include +#include #include using BoolMsg = std_msgs::msg::Bool; @@ -43,7 +43,7 @@ using SystemStatusMsg = panther_msgs::msg::SystemStatus; using SetBoolSrv = std_srvs::srv::SetBool; using TriggerSrv = std_srvs::srv::Trigger; -class SafetyManagerNodeWrapper : public panther_manager::SafetyManagerNode +class SafetyManagerNodeWrapper : public husarion_ugv_manager::SafetyManagerNode { public: SafetyManagerNodeWrapper( diff --git a/panther_manager/test/test_safety_manager_node.cpp b/husarion_ugv_manager/test/test_safety_manager_node.cpp similarity index 94% rename from panther_manager/test/test_safety_manager_node.cpp rename to husarion_ugv_manager/test/test_safety_manager_node.cpp index afd85de9c..036ccdfe6 100644 --- a/panther_manager/test/test_safety_manager_node.cpp +++ b/husarion_ugv_manager/test/test_safety_manager_node.cpp @@ -29,13 +29,13 @@ #include "sensor_msgs/msg/battery_state.hpp" #include "std_msgs/msg/bool.hpp" -#include -#include "panther_utils/test/ros_test_utils.hpp" +#include +#include "husarion_ugv_utils/test/ros_test_utils.hpp" using BoolMsg = std_msgs::msg::Bool; using BatteryStateMsg = sensor_msgs::msg::BatteryState; -class SafetyManagerNodeWrapper : public panther_manager::SafetyManagerNode +class SafetyManagerNodeWrapper : public husarion_ugv_manager::SafetyManagerNode { public: SafetyManagerNodeWrapper( @@ -167,7 +167,7 @@ TEST_F(TestSafetyManagerNode, BatteryCBBlackboardUpdate) battery_state.power_supply_health = expected_health; battery_state.temperature = expected_temp; - panther_utils::test_utils::PublishAndSpin( + husarion_ugv_utils::test_utils::PublishAndSpin( safety_manager_node_, "battery/battery_status", battery_state); auto blackboard = safety_manager_node_->GetSafetyTreeBlackboard(); @@ -183,7 +183,7 @@ TEST_F(TestSafetyManagerNode, EStopCBBlackboardUpdate) auto bool_msg = std_msgs::msg::Bool(); bool_msg.data = expected_state; - panther_utils::test_utils::PublishAndSpin( + husarion_ugv_utils::test_utils::PublishAndSpin( safety_manager_node_, "hardware/e_stop", bool_msg, transient_local_qos); auto blackboard = safety_manager_node_->GetSafetyTreeBlackboard(); @@ -200,7 +200,7 @@ TEST_F(TestSafetyManagerNode, DriverStateCBBlackboardUpdate) auto driver_state_msg = panther_msgs::msg::RobotDriverState(); driver_state_msg.driver_states.push_back(driver_state); - panther_utils::test_utils::PublishAndSpin( + husarion_ugv_utils::test_utils::PublishAndSpin( safety_manager_node_, "hardware/robot_driver_state", driver_state_msg); auto blackboard = safety_manager_node_->GetSafetyTreeBlackboard(); @@ -216,7 +216,7 @@ TEST_F(TestSafetyManagerNode, IOStateCBBlackboardUpdate) io_state_msg.aux_power = expected_aux_state; io_state_msg.fan = expected_fan_state; - panther_utils::test_utils::PublishAndSpin( + husarion_ugv_utils::test_utils::PublishAndSpin( safety_manager_node_, "hardware/io_state", io_state_msg, transient_local_qos); auto blackboard = safety_manager_node_->GetSafetyTreeBlackboard(); @@ -231,7 +231,7 @@ TEST_F(TestSafetyManagerNode, SystemStatusCBBlackboardUpdate) auto system_status_msg = panther_msgs::msg::SystemStatus(); system_status_msg.cpu_temp = expected_temp; - panther_utils::test_utils::PublishAndSpin( + husarion_ugv_utils::test_utils::PublishAndSpin( safety_manager_node_, "system_status", system_status_msg); auto blackboard = safety_manager_node_->GetSafetyTreeBlackboard(); diff --git a/panther_manager/test/utils/behavior_tree_test_utils.hpp b/husarion_ugv_manager/test/utils/behavior_tree_test_utils.hpp similarity index 88% rename from panther_manager/test/utils/behavior_tree_test_utils.hpp rename to husarion_ugv_manager/test/utils/behavior_tree_test_utils.hpp index 2a7398113..05162ce80 100644 --- a/panther_manager/test/utils/behavior_tree_test_utils.hpp +++ b/husarion_ugv_manager/test/utils/behavior_tree_test_utils.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_MANAGER_TEST_UTILS_BEHAVIOR_TREE_TEST_UTILS_HPP_ -#define PANTHER_MANAGER_TEST_UTILS_BEHAVIOR_TREE_TEST_UTILS_HPP_ +#ifndef HUSARION_UGV_MANAGER_TEST_UTILS_BEHAVIOR_TREE_TEST_UTILS_HPP_ +#define HUSARION_UGV_MANAGER_TEST_UTILS_BEHAVIOR_TREE_TEST_UTILS_HPP_ #include #include @@ -57,4 +57,4 @@ bool SpinWhileRunning( } // namespace behavior_tree::test_utils -#endif // PANTHER_MANAGER_TEST_UTILS_BEHAVIOR_TREE_TEST_UTILS_HPP_ +#endif // HUSARION_UGV_MANAGER_TEST_UTILS_BEHAVIOR_TREE_TEST_UTILS_HPP_ diff --git a/panther_manager/test/utils/plugin_test_utils.hpp b/husarion_ugv_manager/test/utils/plugin_test_utils.hpp similarity index 80% rename from panther_manager/test/utils/plugin_test_utils.hpp rename to husarion_ugv_manager/test/utils/plugin_test_utils.hpp index 16a4a605b..f9d4af87e 100644 --- a/panther_manager/test/utils/plugin_test_utils.hpp +++ b/husarion_ugv_manager/test/utils/plugin_test_utils.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_MANAGER_PLUGIN_TEST_UTILS_HPP_ -#define PANTHER_MANAGER_PLUGIN_TEST_UTILS_HPP_ +#ifndef HUSARION_UGV_MANAGER_PLUGIN_TEST_UTILS_HPP_ +#define HUSARION_UGV_MANAGER_PLUGIN_TEST_UTILS_HPP_ #include #include @@ -32,15 +32,15 @@ #include "panther_msgs/srv/set_led_animation.hpp" -#include "panther_manager/plugins/action/call_set_bool_service_node.hpp" -#include "panther_manager/plugins/action/call_set_led_animation_service_node.hpp" -#include "panther_manager/plugins/action/call_trigger_service_node.hpp" -#include "panther_manager/plugins/action/shutdown_hosts_from_file_node.hpp" -#include "panther_manager/plugins/action/shutdown_single_host_node.hpp" -#include "panther_manager/plugins/action/signal_shutdown_node.hpp" -#include "panther_manager/plugins/decorator/tick_after_timeout_node.hpp" +#include "husarion_ugv_manager/plugins/action/call_set_bool_service_node.hpp" +#include "husarion_ugv_manager/plugins/action/call_set_led_animation_service_node.hpp" +#include "husarion_ugv_manager/plugins/action/call_trigger_service_node.hpp" +#include "husarion_ugv_manager/plugins/action/shutdown_hosts_from_file_node.hpp" +#include "husarion_ugv_manager/plugins/action/shutdown_single_host_node.hpp" +#include "husarion_ugv_manager/plugins/action/signal_shutdown_node.hpp" +#include "husarion_ugv_manager/plugins/decorator/tick_after_timeout_node.hpp" -namespace panther_manager::plugin_test_utils +namespace husarion_ugv_manager::plugin_test_utils { struct BehaviorTreePluginDescription @@ -55,7 +55,7 @@ class PluginTestUtils : public testing::Test PluginTestUtils() { rclcpp::init(0, nullptr); - bt_node_ = std::make_shared("test_panther_manager_node"); + bt_node_ = std::make_shared("test_husarion_ugv_manager_node"); } ~PluginTestUtils() @@ -153,5 +153,5 @@ class PluginTestUtils : public testing::Test )"; }; -} // namespace panther_manager::plugin_test_utils -#endif // PANTHER_MANAGER_PLUGIN_TEST_UTILS_HPP_ +} // namespace husarion_ugv_manager::plugin_test_utils +#endif // HUSARION_UGV_MANAGER_PLUGIN_TEST_UTILS_HPP_ diff --git a/panther_utils/CHANGELOG.rst b/husarion_ugv_utils/CHANGELOG.rst similarity index 100% rename from panther_utils/CHANGELOG.rst rename to husarion_ugv_utils/CHANGELOG.rst diff --git a/panther_utils/CMakeLists.txt b/husarion_ugv_utils/CMakeLists.txt similarity index 99% rename from panther_utils/CMakeLists.txt rename to husarion_ugv_utils/CMakeLists.txt index 9fbca5440..6753ec7c0 100644 --- a/panther_utils/CMakeLists.txt +++ b/husarion_ugv_utils/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.10.2) -project(panther_utils) +project(husarion_ugv_utils) if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options(-Wall -Wextra -Wpedantic) diff --git a/panther_utils/README.md b/husarion_ugv_utils/README.md similarity index 52% rename from panther_utils/README.md rename to husarion_ugv_utils/README.md index 78fbdf343..62ae91402 100644 --- a/panther_utils/README.md +++ b/husarion_ugv_utils/README.md @@ -1,3 +1,3 @@ -# panther_utils +# husarion_ugv_utils -Package containing commonly used functions, classes, and configurations for the Husarion Panther system. +Package containing commonly used functions, classes, and configurations for the Husarion UGV system. diff --git a/panther_utils/panther_utils/__init__.py b/husarion_ugv_utils/husarion_ugv_utils/__init__.py similarity index 100% rename from panther_utils/panther_utils/__init__.py rename to husarion_ugv_utils/husarion_ugv_utils/__init__.py diff --git a/panther_utils/panther_utils/integration_test_utils.py b/husarion_ugv_utils/husarion_ugv_utils/integration_test_utils.py similarity index 100% rename from panther_utils/panther_utils/integration_test_utils.py rename to husarion_ugv_utils/husarion_ugv_utils/integration_test_utils.py diff --git a/panther_utils/panther_utils/messages.py b/husarion_ugv_utils/husarion_ugv_utils/messages.py similarity index 100% rename from panther_utils/panther_utils/messages.py rename to husarion_ugv_utils/husarion_ugv_utils/messages.py diff --git a/panther_utils/include/panther_utils/common_utilities.hpp b/husarion_ugv_utils/include/husarion_ugv_utils/common_utilities.hpp similarity index 93% rename from panther_utils/include/panther_utils/common_utilities.hpp rename to husarion_ugv_utils/include/husarion_ugv_utils/common_utilities.hpp index 237f24b56..a82b09271 100644 --- a/panther_utils/include/panther_utils/common_utilities.hpp +++ b/husarion_ugv_utils/include/husarion_ugv_utils/common_utilities.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_UTILS_COMMON_UTILITIES_HPP_ -#define PANTHER_UTILS_COMMON_UTILITIES_HPP_ +#ifndef HUSARION_UGV_UTILS_COMMON_UTILITIES_HPP_ +#define HUSARION_UGV_UTILS_COMMON_UTILITIES_HPP_ #include #include @@ -21,7 +21,7 @@ #include #include -namespace panther_utils::common_utilities +namespace husarion_ugv_utils::common_utilities { /** @@ -121,6 +121,6 @@ inline bool MeetsVersionRequirement(const float version, const float required_ve return version >= required_version - std::numeric_limits::epsilon(); } -} // namespace panther_utils::common_utilities +} // namespace husarion_ugv_utils::common_utilities -#endif // PANTHER_UTILS_COMMON_UTILITIES_HPP_ +#endif // HUSARION_UGV_UTILS_COMMON_UTILITIES_HPP_ diff --git a/panther_utils/include/panther_utils/configure_rt.hpp b/husarion_ugv_utils/include/husarion_ugv_utils/configure_rt.hpp similarity index 87% rename from panther_utils/include/panther_utils/configure_rt.hpp rename to husarion_ugv_utils/include/husarion_ugv_utils/configure_rt.hpp index 1d6d58ae4..6420b6bfb 100644 --- a/panther_utils/include/panther_utils/configure_rt.hpp +++ b/husarion_ugv_utils/include/husarion_ugv_utils/configure_rt.hpp @@ -12,14 +12,14 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_UTILS_CONFIGURE_RT_HPP_ -#define PANTHER_UTILS_CONFIGURE_RT_HPP_ +#ifndef HUSARION_UGV_UTILS_CONFIGURE_RT_HPP_ +#define HUSARION_UGV_UTILS_CONFIGURE_RT_HPP_ #include #include "realtime_tools/thread_priority.hpp" -namespace panther_utils +namespace husarion_ugv_utils { /** * @brief Configures thread that calls this function to FIFO scheduler with RT priority @@ -44,6 +44,6 @@ inline void ConfigureRT(const unsigned priority) } } -} // namespace panther_utils +} // namespace husarion_ugv_utils -#endif // PANTHER_UTILS_CONFIGURE_RT_HPP_ +#endif // HUSARION_UGV_UTILS_CONFIGURE_RT_HPP_ diff --git a/panther_utils/include/panther_utils/diagnostics.hpp b/husarion_ugv_utils/include/husarion_ugv_utils/diagnostics.hpp similarity index 88% rename from panther_utils/include/panther_utils/diagnostics.hpp rename to husarion_ugv_utils/include/husarion_ugv_utils/diagnostics.hpp index 937a8fc2c..f1278f4c4 100644 --- a/panther_utils/include/panther_utils/diagnostics.hpp +++ b/husarion_ugv_utils/include/husarion_ugv_utils/diagnostics.hpp @@ -12,15 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_UTILS_DIAGNOSTICS_HPP_ -#define PANTHER_UTILS_DIAGNOSTICS_HPP_ +#ifndef HUSARION_UGV_UTILS_DIAGNOSTICS_HPP_ +#define HUSARION_UGV_UTILS_DIAGNOSTICS_HPP_ #include #include #include "diagnostic_updater/diagnostic_status_wrapper.hpp" -namespace panther_utils::diagnostics +namespace husarion_ugv_utils::diagnostics { /** @@ -49,6 +49,6 @@ void AddKeyValueIfTrue( } } -} // namespace panther_utils::diagnostics +} // namespace husarion_ugv_utils::diagnostics -#endif // PANTHER_UTILS_DIAGNOSTICS_HPP_ +#endif // HUSARION_UGV_UTILS_DIAGNOSTICS_HPP_ diff --git a/panther_utils/include/panther_utils/moving_average.hpp b/husarion_ugv_utils/include/husarion_ugv_utils/moving_average.hpp similarity index 86% rename from panther_utils/include/panther_utils/moving_average.hpp rename to husarion_ugv_utils/include/husarion_ugv_utils/moving_average.hpp index 7575c562b..0a6c76363 100644 --- a/panther_utils/include/panther_utils/moving_average.hpp +++ b/husarion_ugv_utils/include/husarion_ugv_utils/moving_average.hpp @@ -12,12 +12,12 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_UTILS_MOVING_AVERAGE_HPP_ -#define PANTHER_UTILS_MOVING_AVERAGE_HPP_ +#ifndef HUSARION_UGV_UTILS_MOVING_AVERAGE_HPP_ +#define HUSARION_UGV_UTILS_MOVING_AVERAGE_HPP_ #include -namespace panther_utils +namespace husarion_ugv_utils { template @@ -61,6 +61,6 @@ class MovingAverage T sum_; }; -} // namespace panther_utils +} // namespace husarion_ugv_utils -#endif // PANTHER_UTILS_MOVING_AVERAGE_HPP_ +#endif // HUSARION_UGV_UTILS_MOVING_AVERAGE_HPP_ diff --git a/panther_utils/include/panther_utils/ros_utils.hpp b/husarion_ugv_utils/include/husarion_ugv_utils/ros_utils.hpp similarity index 94% rename from panther_utils/include/panther_utils/ros_utils.hpp rename to husarion_ugv_utils/include/husarion_ugv_utils/ros_utils.hpp index d8157bc11..6d226ca7b 100644 --- a/panther_utils/include/panther_utils/ros_utils.hpp +++ b/husarion_ugv_utils/include/husarion_ugv_utils/ros_utils.hpp @@ -12,14 +12,14 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_UTILS__ROS_UTILS_HPP_ -#define PANTHER_UTILS__ROS_UTILS_HPP_ +#ifndef HUSARION_UGV_UTILS__ROS_UTILS_HPP_ +#define HUSARION_UGV_UTILS__ROS_UTILS_HPP_ #include #include "std_msgs/msg/header.hpp" -namespace panther_utils::ros +namespace husarion_ugv_utils::ros { /** @@ -105,6 +105,6 @@ std::string AddNamespaceToFrameID(const std::string & frame_id, const std::strin return tf_prefix + frame_id; } -} // namespace panther_utils::ros +} // namespace husarion_ugv_utils::ros -#endif // PANTHER_UTILS__ROS_UTILS_HPP_ +#endif // HUSARION_UGV_UTILS__ROS_UTILS_HPP_ diff --git a/panther_utils/include/panther_utils/test/ros_test_utils.hpp b/husarion_ugv_utils/include/husarion_ugv_utils/test/ros_test_utils.hpp similarity index 93% rename from panther_utils/include/panther_utils/test/ros_test_utils.hpp rename to husarion_ugv_utils/include/husarion_ugv_utils/test/ros_test_utils.hpp index c6a6b7289..aaef6de1c 100644 --- a/panther_utils/include/panther_utils/test/ros_test_utils.hpp +++ b/husarion_ugv_utils/include/husarion_ugv_utils/test/ros_test_utils.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_UTILS_TEST_UTILS_HPP_ -#define PANTHER_UTILS_TEST_UTILS_HPP_ +#ifndef HUSARION_UGV_UTILS_TEST_UTILS_HPP_ +#define HUSARION_UGV_UTILS_TEST_UTILS_HPP_ #include #include @@ -22,7 +22,7 @@ #include "rclcpp/rclcpp.hpp" -namespace panther_utils::test_utils +namespace husarion_ugv_utils::test_utils { /** @@ -100,6 +100,6 @@ void PublishAndSpin( std::this_thread::sleep_for(std::chrono::milliseconds(10)); } -} // namespace panther_utils::test_utils +} // namespace husarion_ugv_utils::test_utils -#endif // PANTHER_UTILS_TEST_UTILS_HPP_ +#endif // HUSARION_UGV_UTILS_TEST_UTILS_HPP_ diff --git a/panther_utils/include/panther_utils/test/test_utils.hpp b/husarion_ugv_utils/include/husarion_ugv_utils/test/test_utils.hpp similarity index 90% rename from panther_utils/include/panther_utils/test/test_utils.hpp rename to husarion_ugv_utils/include/husarion_ugv_utils/test/test_utils.hpp index a71322c0e..1346f5f4a 100644 --- a/panther_utils/include/panther_utils/test/test_utils.hpp +++ b/husarion_ugv_utils/include/husarion_ugv_utils/test/test_utils.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_UTILS_TEST_UTILS_HPP_ -#define PANTHER_UTILS_TEST_UTILS_HPP_ +#ifndef HUSARION_UGV_UTILS_TEST_UTILS_HPP_ +#define HUSARION_UGV_UTILS_TEST_UTILS_HPP_ #include #include @@ -22,7 +22,7 @@ #include #include -namespace panther_utils::test_utils +namespace husarion_ugv_utils::test_utils { /** @@ -69,6 +69,6 @@ bool IsMessageThrown(const Func & func, const std::string & error_msg) return false; } -} // namespace panther_utils::test_utils +} // namespace husarion_ugv_utils::test_utils -#endif // PANTHER_UTILS_TEST_UTILS_HPP_ +#endif // HUSARION_UGV_UTILS_TEST_UTILS_HPP_ diff --git a/panther_utils/include/panther_utils/yaml_utils.hpp b/husarion_ugv_utils/include/husarion_ugv_utils/yaml_utils.hpp similarity index 91% rename from panther_utils/include/panther_utils/yaml_utils.hpp rename to husarion_ugv_utils/include/husarion_ugv_utils/yaml_utils.hpp index e6137bdaa..8d32559a8 100644 --- a/panther_utils/include/panther_utils/yaml_utils.hpp +++ b/husarion_ugv_utils/include/husarion_ugv_utils/yaml_utils.hpp @@ -12,15 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PANTHER_UTILS_YAML_UTILS_HPP_ -#define PANTHER_UTILS_YAML_UTILS_HPP_ +#ifndef HUSARION_UGV_UTILS_YAML_UTILS_HPP_ +#define HUSARION_UGV_UTILS_YAML_UTILS_HPP_ #include #include #include "yaml-cpp/yaml.h" -namespace panther_utils +namespace husarion_ugv_utils { /** @@ -69,6 +69,6 @@ T GetYAMLKeyValue(const YAML::Node & description, const std::string & key, const } } -} // namespace panther_utils +} // namespace husarion_ugv_utils -#endif // PANTHER_UTILS_YAML_UTILS_HPP_ +#endif // HUSARION_UGV_UTILS_YAML_UTILS_HPP_ diff --git a/panther_utils/package.xml b/husarion_ugv_utils/package.xml similarity index 97% rename from panther_utils/package.xml rename to husarion_ugv_utils/package.xml index aad717ec0..9c5c4fd98 100644 --- a/panther_utils/package.xml +++ b/husarion_ugv_utils/package.xml @@ -1,7 +1,7 @@ - panther_utils + husarion_ugv_utils 2.1.1 Package for commonly used functions, classes, and configurations Husarion diff --git a/panther_utils/test/test_common_utilities.cpp b/husarion_ugv_utils/test/test_common_utilities.cpp similarity index 67% rename from panther_utils/test/test_common_utilities.cpp rename to husarion_ugv_utils/test/test_common_utilities.cpp index 031dd0434..fe3749361 100644 --- a/panther_utils/test/test_common_utilities.cpp +++ b/husarion_ugv_utils/test/test_common_utilities.cpp @@ -20,14 +20,14 @@ #include "gtest/gtest.h" -#include "panther_utils/common_utilities.hpp" +#include "husarion_ugv_utils/common_utilities.hpp" TEST(TestSetPrecision, TwoDigitPrecision) { float value = 3.14159; float expected_result = 3.14; - float result = panther_utils::common_utilities::SetPrecision(value, 2); + float result = husarion_ugv_utils::common_utilities::SetPrecision(value, 2); EXPECT_FLOAT_EQ(expected_result, result); } @@ -37,7 +37,7 @@ TEST(TestSetPrecision, ZeroDigitPrecision) float value = 3.54159; float expected_result = 4.0; - float result = panther_utils::common_utilities::SetPrecision(value, 0); + float result = husarion_ugv_utils::common_utilities::SetPrecision(value, 0); EXPECT_FLOAT_EQ(expected_result, result); } @@ -46,7 +46,7 @@ TEST(TestSetPrecision, NegativeValue) { float value = -3.14159; float expected_result = -3.14; - float result = panther_utils::common_utilities::SetPrecision(value, 2); + float result = husarion_ugv_utils::common_utilities::SetPrecision(value, 2); EXPECT_FLOAT_EQ(expected_result, result); } @@ -54,7 +54,7 @@ TEST(TestSetPrecision, LargeValue) { float value = 123456.789; float expected_result = 123456.79; - float result = panther_utils::common_utilities::SetPrecision(value, 2); + float result = husarion_ugv_utils::common_utilities::SetPrecision(value, 2); EXPECT_FLOAT_EQ(expected_result, result); } @@ -64,7 +64,7 @@ TEST(TestCountPercentage, ValidValues) int total = 100; float expected_result = 25.00; - float result = panther_utils::common_utilities::CountPercentage(value, total); + float result = husarion_ugv_utils::common_utilities::CountPercentage(value, total); EXPECT_FLOAT_EQ(expected_result, result); } @@ -75,7 +75,7 @@ TEST(TestCountPercentage, ZeroTotal) int total = 0; EXPECT_THROW( - panther_utils::common_utilities::CountPercentage(value, total), std::invalid_argument); + husarion_ugv_utils::common_utilities::CountPercentage(value, total), std::invalid_argument); } TEST(TestCountPercentage, ZeroValue) @@ -84,7 +84,7 @@ TEST(TestCountPercentage, ZeroValue) int total = 100; float expected_result = 0.00; - float result = panther_utils::common_utilities::CountPercentage(value, total); + float result = husarion_ugv_utils::common_utilities::CountPercentage(value, total); EXPECT_FLOAT_EQ(expected_result, result); } @@ -95,7 +95,7 @@ TEST(TestPrefixMapKeys, CorrectlyPrefixesKeys) std::string prefix = "prefix_"; std::map expected_map = {{"prefix_key1", 1}, {"prefix_key2", 2}}; - auto result_map = panther_utils::common_utilities::PrefixMapKeys(input_map, prefix); + auto result_map = husarion_ugv_utils::common_utilities::PrefixMapKeys(input_map, prefix); EXPECT_EQ(result_map, expected_map); } @@ -106,7 +106,7 @@ TEST(TestPrefixMapKeys, HandlesEmptyPrefix) std::string prefix = ""; std::map expected_map = input_map; // The maps should be identical - auto result_map = panther_utils::common_utilities::PrefixMapKeys(input_map, prefix); + auto result_map = husarion_ugv_utils::common_utilities::PrefixMapKeys(input_map, prefix); EXPECT_EQ(result_map, expected_map); } @@ -117,7 +117,7 @@ TEST(TestPrefixMapKeys, HandlesEmptyMap) std::string prefix = "prefix_"; std::map expected_map; - auto result_map = panther_utils::common_utilities::PrefixMapKeys(input_map, prefix); + auto result_map = husarion_ugv_utils::common_utilities::PrefixMapKeys(input_map, prefix); EXPECT_EQ(result_map, expected_map); } @@ -128,14 +128,14 @@ TEST(TestPrefixMapKeys, HandlesNonAlphanumericPrefix) std::string prefix = "prefix_@#"; std::map expected_map = {{"prefix_@#key1", 1}, {"prefix_@#key2", 2}}; - auto result_map = panther_utils::common_utilities::PrefixMapKeys(input_map, prefix); + auto result_map = husarion_ugv_utils::common_utilities::PrefixMapKeys(input_map, prefix); EXPECT_EQ(result_map, expected_map); } TEST(TestOpenFile, HandleOpenFile) { - std::string path = testing::TempDir() + "test_panther_utils_open_file"; + std::string path = testing::TempDir() + "test_husarion_ugv_utils_open_file"; // Make sure that there is no random file. std::filesystem::remove(path); @@ -143,26 +143,27 @@ TEST(TestOpenFile, HandleOpenFile) std::ofstream ofs(path); ofs.close(); - EXPECT_NO_THROW({ panther_utils::common_utilities::OpenFile(path, std::ios_base::out); }); + EXPECT_NO_THROW({ husarion_ugv_utils::common_utilities::OpenFile(path, std::ios_base::out); }); std::filesystem::remove(path); } TEST(TestOpenFile, HandleOpenFileThrow) { - std::string path = testing::TempDir() + "test_panther_utils_open_file"; + std::string path = testing::TempDir() + "test_husarion_ugv_utils_open_file"; // Make sure that there is no random file. std::filesystem::remove(path); EXPECT_THROW( - { panther_utils::common_utilities::OpenFile(path, std::ios_base::in); }, std::runtime_error); + { husarion_ugv_utils::common_utilities::OpenFile(path, std::ios_base::in); }, + std::runtime_error); } TEST(TestMeetsVersionRequirement, SameVersion) { float version = 1.06; - auto is_met = panther_utils::common_utilities::MeetsVersionRequirement(version, 1.06); + auto is_met = husarion_ugv_utils::common_utilities::MeetsVersionRequirement(version, 1.06); EXPECT_TRUE(is_met); } @@ -171,7 +172,7 @@ TEST(TestMeetsVersionRequirement, LowerVersion) { float version = 1.2; - auto is_met = panther_utils::common_utilities::MeetsVersionRequirement(version, 1.06); + auto is_met = husarion_ugv_utils::common_utilities::MeetsVersionRequirement(version, 1.06); EXPECT_TRUE(is_met); } @@ -180,7 +181,7 @@ TEST(TestMeetsVersionRequirement, HigherVersion) { float version = 1.0; - auto is_met = panther_utils::common_utilities::MeetsVersionRequirement(version, 1.06); + auto is_met = husarion_ugv_utils::common_utilities::MeetsVersionRequirement(version, 1.06); EXPECT_FALSE(is_met); } @@ -189,7 +190,7 @@ TEST(TestMeetsVersionRequirement, NaNVersionRequired) { float version = std::numeric_limits::quiet_NaN(); - auto is_met = panther_utils::common_utilities::MeetsVersionRequirement(version, 1.06); + auto is_met = husarion_ugv_utils::common_utilities::MeetsVersionRequirement(version, 1.06); EXPECT_FALSE(is_met); } diff --git a/panther_utils/test/test_diagnostics.cpp b/husarion_ugv_utils/test/test_diagnostics.cpp similarity index 84% rename from panther_utils/test/test_diagnostics.cpp rename to husarion_ugv_utils/test/test_diagnostics.cpp index c09eddc48..993275d8f 100644 --- a/panther_utils/test/test_diagnostics.cpp +++ b/husarion_ugv_utils/test/test_diagnostics.cpp @@ -20,14 +20,14 @@ #include "diagnostic_updater/diagnostic_status_wrapper.hpp" -#include "panther_utils/diagnostics.hpp" +#include "husarion_ugv_utils/diagnostics.hpp" TEST(TestAddKeyValueIfTrue, HandlesBoolean) { diagnostic_updater::DiagnosticStatusWrapper status; std::map kv_map = {{"key1", true}, {"key2", false}, {"key3", true}}; - panther_utils::diagnostics::AddKeyValueIfTrue(status, kv_map); + husarion_ugv_utils::diagnostics::AddKeyValueIfTrue(status, kv_map); ASSERT_EQ(2, status.values.size()); EXPECT_EQ("key1", status.values.at(0).key); @@ -40,7 +40,7 @@ TEST(TestAddKeyValueIfTrue, HandlesSmartPointer) std::map> kv_map = { {"key1", nullptr}, {"key2", nullptr}, {"key3", std::make_shared(1)}}; - panther_utils::diagnostics::AddKeyValueIfTrue(status, kv_map); + husarion_ugv_utils::diagnostics::AddKeyValueIfTrue(status, kv_map); ASSERT_EQ(1, status.values.size()); EXPECT_EQ("key3", status.values.at(0).key); @@ -51,7 +51,7 @@ TEST(TestAddKeyValueIfTrue, HandlesInteger) diagnostic_updater::DiagnosticStatusWrapper status; std::map kv_map = {{"key1", 0}, {"key2", 1}, {"key3", 2}}; - panther_utils::diagnostics::AddKeyValueIfTrue(status, kv_map); + husarion_ugv_utils::diagnostics::AddKeyValueIfTrue(status, kv_map); ASSERT_EQ(2, status.values.size()); EXPECT_EQ("key2", status.values.at(0).key); @@ -63,7 +63,7 @@ TEST(TestAddKeyValueIfTrue, HandlesEmptyMap) diagnostic_updater::DiagnosticStatusWrapper status; std::map kv_map; - panther_utils::diagnostics::AddKeyValueIfTrue(status, kv_map); + husarion_ugv_utils::diagnostics::AddKeyValueIfTrue(status, kv_map); ASSERT_EQ(0, status.values.size()); } @@ -73,7 +73,7 @@ TEST(TestAddKeyValueIfTrue, HandlesPrefixAndSuffix) diagnostic_updater::DiagnosticStatusWrapper status; std::map kv_map = {{"key1", true}, {"key2", false}, {"key3", true}}; - panther_utils::diagnostics::AddKeyValueIfTrue(status, kv_map, "prefix_", "_suffix"); + husarion_ugv_utils::diagnostics::AddKeyValueIfTrue(status, kv_map, "prefix_", "_suffix"); ASSERT_EQ(2, status.values.size()); EXPECT_EQ("prefix_key1_suffix", status.values.at(0).key); diff --git a/panther_utils/test/test_moving_average.cpp b/husarion_ugv_utils/test/test_moving_average.cpp similarity index 80% rename from panther_utils/test/test_moving_average.cpp rename to husarion_ugv_utils/test/test_moving_average.cpp index f102a7b29..653483ce7 100644 --- a/panther_utils/test/test_moving_average.cpp +++ b/husarion_ugv_utils/test/test_moving_average.cpp @@ -14,29 +14,29 @@ #include "gtest/gtest.h" -#include "panther_utils/moving_average.hpp" +#include "husarion_ugv_utils/moving_average.hpp" TEST(TestMovingAverage, TestDefaultInitialValue) { - panther_utils::MovingAverage ma(4); + husarion_ugv_utils::MovingAverage ma(4); EXPECT_EQ(0.0, ma.GetAverage()); } TEST(TestMovingAverage, TestIntialValue) { - panther_utils::MovingAverage ma(4, 1.0); + husarion_ugv_utils::MovingAverage ma(4, 1.0); EXPECT_EQ(1.0, ma.GetAverage()); - panther_utils::MovingAverage ma_1(10, 3.7); + husarion_ugv_utils::MovingAverage ma_1(10, 3.7); EXPECT_EQ(3.7, ma_1.GetAverage()); - panther_utils::MovingAverage ma_2(3, 4); + husarion_ugv_utils::MovingAverage ma_2(3, 4); EXPECT_EQ(4, ma_2.GetAverage()); } TEST(TestMovingAverage, TestOutputValues) { - panther_utils::MovingAverage ma(4); + husarion_ugv_utils::MovingAverage ma(4); ma.Roll(1.0); ASSERT_EQ(1.0, ma.GetAverage()); @@ -57,7 +57,7 @@ TEST(TestMovingAverage, TestOutputValues) TEST(TestMovingAverage, TestHighOverload) { const std::size_t window_len = 1000; - panther_utils::MovingAverage ma(window_len); + husarion_ugv_utils::MovingAverage ma(window_len); double sum = 0.0; for (std::size_t i = 1; i <= window_len * 10; i++) { @@ -74,7 +74,7 @@ TEST(TestMovingAverage, TestHighOverload) TEST(TestMovingAverage, TestIntFloorRound) { - panther_utils::MovingAverage ma; + husarion_ugv_utils::MovingAverage ma; ma.Roll(1); ma.Roll(2); EXPECT_EQ(1, ma.GetAverage()); @@ -82,7 +82,7 @@ TEST(TestMovingAverage, TestIntFloorRound) TEST(TestMovingAverage, TestReset) { - panther_utils::MovingAverage ma(4); + husarion_ugv_utils::MovingAverage ma(4); ma.Roll(1.0); ma.Roll(2.0); ma.Roll(1.0); @@ -99,7 +99,7 @@ TEST(TestMovingAverage, TestReset) TEST(TestMovingAverage, TestResetToInitialValue) { - panther_utils::MovingAverage ma(4, 7.0); + husarion_ugv_utils::MovingAverage ma(4, 7.0); ma.Roll(1.0); ma.Roll(2.0); EXPECT_EQ(1.5, ma.GetAverage()); diff --git a/panther_utils/test/test_ros_test_utils.cpp b/husarion_ugv_utils/test/test_ros_test_utils.cpp similarity index 84% rename from panther_utils/test/test_ros_test_utils.cpp rename to husarion_ugv_utils/test/test_ros_test_utils.cpp index d47d2d139..04ea84ac9 100644 --- a/panther_utils/test/test_ros_test_utils.cpp +++ b/husarion_ugv_utils/test/test_ros_test_utils.cpp @@ -21,7 +21,7 @@ #include "std_msgs/msg/empty.hpp" -#include "panther_utils/test/ros_test_utils.hpp" +#include "husarion_ugv_utils/test/ros_test_utils.hpp" TEST(TestROSTestUtils, WaitForMessage) { @@ -34,11 +34,11 @@ TEST(TestROSTestUtils, WaitForMessage) topic_name, 10, [&](const std_msgs::msg::Empty::SharedPtr msg) { empty_msg = msg; }); EXPECT_FALSE( - panther_utils::test_utils::WaitForMsg(node, empty_msg, std::chrono::milliseconds(1000))); + husarion_ugv_utils::test_utils::WaitForMsg(node, empty_msg, std::chrono::milliseconds(1000))); pub->publish(std_msgs::msg::Empty()); EXPECT_TRUE( - panther_utils::test_utils::WaitForMsg(node, empty_msg, std::chrono::milliseconds(1000))); + husarion_ugv_utils::test_utils::WaitForMsg(node, empty_msg, std::chrono::milliseconds(1000))); } TEST(TestROSTestUtils, PublishAndSpin) @@ -53,7 +53,7 @@ TEST(TestROSTestUtils, PublishAndSpin) EXPECT_FALSE(received_msg); - panther_utils::test_utils::PublishAndSpin(node, topic_name, published_msg); + husarion_ugv_utils::test_utils::PublishAndSpin(node, topic_name, published_msg); EXPECT_TRUE(received_msg); } diff --git a/panther_utils/test/test_ros_utils.cpp b/husarion_ugv_utils/test/test_ros_utils.cpp similarity index 76% rename from panther_utils/test/test_ros_utils.cpp rename to husarion_ugv_utils/test/test_ros_utils.cpp index 5832388a4..eb3e470df 100644 --- a/panther_utils/test/test_ros_utils.cpp +++ b/husarion_ugv_utils/test/test_ros_utils.cpp @@ -17,7 +17,7 @@ #include -#include "panther_utils/ros_utils.hpp" +#include "husarion_ugv_utils/ros_utils.hpp" using HeaderMsg = std_msgs::msg::Header; @@ -32,7 +32,8 @@ TEST(TestVerifyTimestampGap, TimestampGapOk) header_2.stamp.nanosec = 500000000; auto max_timestamp_gap = std::chrono::seconds(2); - EXPECT_NO_THROW(panther_utils::ros::VerifyTimestampGap(header_1, header_2, max_timestamp_gap)); + EXPECT_NO_THROW( + husarion_ugv_utils::ros::VerifyTimestampGap(header_1, header_2, max_timestamp_gap)); } TEST(TestVerifyTimestampGap, TimestampGapExceeding) @@ -48,7 +49,7 @@ TEST(TestVerifyTimestampGap, TimestampGapExceeding) auto max_timestamp_gap = std::chrono::seconds(1); EXPECT_THROW( - panther_utils::ros::VerifyTimestampGap(header_1, header_2, max_timestamp_gap), + husarion_ugv_utils::ros::VerifyTimestampGap(header_1, header_2, max_timestamp_gap), std::runtime_error); } @@ -60,7 +61,7 @@ TEST(TestVerifyTimestampGap, TimestampNotSet) auto max_timestamp_gap = std::chrono::seconds(1); EXPECT_THROW( - panther_utils::ros::VerifyTimestampGap(header_1, header_2, max_timestamp_gap), + husarion_ugv_utils::ros::VerifyTimestampGap(header_1, header_2, max_timestamp_gap), std::runtime_error); } @@ -74,7 +75,7 @@ TEST(TestMergeHeaders, SameFrameIds) HeaderMsg merged_header; - EXPECT_NO_THROW(merged_header = panther_utils::ros::MergeHeaders(header_1, header_2)); + EXPECT_NO_THROW(merged_header = husarion_ugv_utils::ros::MergeHeaders(header_1, header_2)); EXPECT_STREQ("frame", merged_header.frame_id.c_str()); } @@ -86,7 +87,7 @@ TEST(TestMergeHeaders, DifferentFrameIds) HeaderMsg header_2; header_2.frame_id = "frame_2"; - EXPECT_THROW(panther_utils::ros::MergeHeaders(header_1, header_2), std::runtime_error); + EXPECT_THROW(husarion_ugv_utils::ros::MergeHeaders(header_1, header_2), std::runtime_error); } TEST(TestMergeHeaders, EarlierTimestampNanosec) @@ -99,7 +100,7 @@ TEST(TestMergeHeaders, EarlierTimestampNanosec) header_2.stamp.sec = 10; header_2.stamp.nanosec = 500000000; - auto merged_header = panther_utils::ros::MergeHeaders(header_1, header_2); + auto merged_header = husarion_ugv_utils::ros::MergeHeaders(header_1, header_2); EXPECT_EQ(merged_header.stamp.sec, 10); EXPECT_EQ(merged_header.stamp.nanosec, 200000000); @@ -115,7 +116,7 @@ TEST(TestMergeHeaders, EarlierTimestampSec) header_2.stamp.sec = 10; header_2.stamp.nanosec = 500000000; - auto merged_header = panther_utils::ros::MergeHeaders(header_1, header_2); + auto merged_header = husarion_ugv_utils::ros::MergeHeaders(header_1, header_2); EXPECT_EQ(merged_header.stamp.sec, 9); EXPECT_EQ(merged_header.stamp.nanosec, 500000000); @@ -131,7 +132,7 @@ TEST(TestMergeHeaders, LaterTimestamp) header_2.stamp.sec = 9; header_2.stamp.nanosec = 500000000; - auto merged_header = panther_utils::ros::MergeHeaders(header_1, header_2); + auto merged_header = husarion_ugv_utils::ros::MergeHeaders(header_1, header_2); EXPECT_EQ(merged_header.stamp.sec, 9); EXPECT_EQ(merged_header.stamp.nanosec, 500000000); @@ -142,7 +143,7 @@ TEST(TestAddNamespaceToFrameID, WithoutNamespace) std::string frame_id = "frame"; std::string ns = ""; - auto result = panther_utils::ros::AddNamespaceToFrameID(frame_id, ns); + auto result = husarion_ugv_utils::ros::AddNamespaceToFrameID(frame_id, ns); EXPECT_EQ(result, "frame"); } @@ -151,7 +152,7 @@ TEST(TestAddNamespaceToFrameID, WithSlashNamespace) std::string frame_id = "frame"; std::string ns = "/"; - auto result = panther_utils::ros::AddNamespaceToFrameID(frame_id, ns); + auto result = husarion_ugv_utils::ros::AddNamespaceToFrameID(frame_id, ns); EXPECT_EQ(result, "frame"); } @@ -160,7 +161,7 @@ TEST(TestAddNamespaceToFrameID, WithSlashedNamespace) std::string frame_id = "frame"; std::string ns = "/namespace"; - auto result = panther_utils::ros::AddNamespaceToFrameID(frame_id, ns); + auto result = husarion_ugv_utils::ros::AddNamespaceToFrameID(frame_id, ns); EXPECT_EQ(result, "namespace/frame"); } @@ -169,7 +170,7 @@ TEST(TestAddNamespaceToFrameID, WithNamespace) std::string frame_id = "frame"; std::string ns = "namespace"; - auto result = panther_utils::ros::AddNamespaceToFrameID(frame_id, ns); + auto result = husarion_ugv_utils::ros::AddNamespaceToFrameID(frame_id, ns); EXPECT_EQ(result, "namespace/frame"); } diff --git a/panther_utils/test/test_test_utils.cpp b/husarion_ugv_utils/test/test_test_utils.cpp similarity index 66% rename from panther_utils/test/test_test_utils.cpp rename to husarion_ugv_utils/test/test_test_utils.cpp index 4f319edc6..fd9b0a369 100644 --- a/panther_utils/test/test_test_utils.cpp +++ b/husarion_ugv_utils/test/test_test_utils.cpp @@ -18,15 +18,15 @@ #include "gtest/gtest.h" -#include "panther_utils/test/test_utils.hpp" +#include "husarion_ugv_utils/test/test_utils.hpp" template void TestCheckNaNVector() { std::vector vector(10, std::numeric_limits::quiet_NaN()); - EXPECT_TRUE(panther_utils::test_utils::CheckNaNVector(vector)); + EXPECT_TRUE(husarion_ugv_utils::test_utils::CheckNaNVector(vector)); vector.push_back(1.0); - EXPECT_FALSE(panther_utils::test_utils::CheckNaNVector(vector)); + EXPECT_FALSE(husarion_ugv_utils::test_utils::CheckNaNVector(vector)); } TEST(TestTestUtils, CheckNanVector) @@ -39,46 +39,46 @@ TEST(TestTestUtils, CheckNanVector) TEST(TestTestUtils, IsMessageThrownTrue) { - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( []() { throw std::runtime_error("Example exception"); }, "Example exception")); - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( []() { throw std::out_of_range("Example exception"); }, "Example exception")); - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( []() { throw std::invalid_argument("Example exception"); }, "Example exception")); - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( []() { throw std::runtime_error("Example exception"); }, "Example")); - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( []() { throw std::runtime_error("Example exception"); }, "exception")); } TEST(TestTestUtils, IsMessageThrownDifferentException) { - EXPECT_FALSE(panther_utils::test_utils::IsMessageThrown( + EXPECT_FALSE(husarion_ugv_utils::test_utils::IsMessageThrown( []() { throw std::out_of_range("Example exception"); }, "Example exception")); - EXPECT_FALSE(panther_utils::test_utils::IsMessageThrown( + EXPECT_FALSE(husarion_ugv_utils::test_utils::IsMessageThrown( []() { throw std::invalid_argument("Example exception"); }, "Example exception")); - EXPECT_FALSE(panther_utils::test_utils::IsMessageThrown( + EXPECT_FALSE(husarion_ugv_utils::test_utils::IsMessageThrown( []() { throw std::runtime_error("Example exception"); }, "Example exception")); } TEST(TestTestUtils, IsMessageThrownDifferentMessage) { - EXPECT_FALSE(panther_utils::test_utils::IsMessageThrown( + EXPECT_FALSE(husarion_ugv_utils::test_utils::IsMessageThrown( []() { throw std::runtime_error("Example exception"); }, "Different exception message")); - EXPECT_FALSE(panther_utils::test_utils::IsMessageThrown( + EXPECT_FALSE(husarion_ugv_utils::test_utils::IsMessageThrown( []() { throw std::runtime_error("Example exception"); }, "Example exception ")); } TEST(TestTestUtils, IsMessageThrownNoThrow) { - EXPECT_FALSE(panther_utils::test_utils::IsMessageThrown( + EXPECT_FALSE(husarion_ugv_utils::test_utils::IsMessageThrown( []() { return; }, "Example exception")); } diff --git a/panther_utils/test/test_yaml_utils.cpp b/husarion_ugv_utils/test/test_yaml_utils.cpp similarity index 53% rename from panther_utils/test/test_yaml_utils.cpp rename to husarion_ugv_utils/test/test_yaml_utils.cpp index 8f8533508..2f4c62fb1 100644 --- a/panther_utils/test/test_yaml_utils.cpp +++ b/husarion_ugv_utils/test/test_yaml_utils.cpp @@ -15,14 +15,14 @@ #include "gtest/gtest.h" #include "yaml-cpp/yaml.h" -#include "panther_utils/test/test_utils.hpp" -#include "panther_utils/yaml_utils.hpp" +#include "husarion_ugv_utils/test/test_utils.hpp" +#include "husarion_ugv_utils/yaml_utils.hpp" TEST(TestGetYAMLKeyValue, MissingKey) { YAML::Node desc; - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( - [desc]() { panther_utils::GetYAMLKeyValue(desc, "key_name"); }, + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( + [desc]() { husarion_ugv_utils::GetYAMLKeyValue(desc, "key_name"); }, "Missing 'key_name' in description")); } @@ -34,17 +34,19 @@ TEST(TestGetYAMLKeyValue, ConversionFailure) desc["string_key"] = "string"; desc["int_vector_key"] = "[1 2 3]"; - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( - [&]() { panther_utils::GetYAMLKeyValue(desc, "float_key"); }, "Failed to convert")); + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( + [&]() { husarion_ugv_utils::GetYAMLKeyValue(desc, "float_key"); }, "Failed to convert")); - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( - [&]() { panther_utils::GetYAMLKeyValue(desc, "string_key"); }, "Failed to convert")); + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( + [&]() { husarion_ugv_utils::GetYAMLKeyValue(desc, "string_key"); }, + "Failed to convert")); - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( - [&]() { panther_utils::GetYAMLKeyValue(desc, "int_vector_key"); }, "Failed to convert")); + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( + [&]() { husarion_ugv_utils::GetYAMLKeyValue(desc, "int_vector_key"); }, + "Failed to convert")); - EXPECT_TRUE(panther_utils::test_utils::IsMessageThrown( - [&]() { panther_utils::GetYAMLKeyValue>(desc, "string_key"); }, + EXPECT_TRUE(husarion_ugv_utils::test_utils::IsMessageThrown( + [&]() { husarion_ugv_utils::GetYAMLKeyValue>(desc, "string_key"); }, "Failed to convert")); } @@ -56,13 +58,13 @@ TEST(TestGetYAMLKeyValue, GetKey) desc["float_key"] = 1.5; desc["string_key"] = "string"; - const auto int_value = panther_utils::GetYAMLKeyValue(desc, "int_key"); + const auto int_value = husarion_ugv_utils::GetYAMLKeyValue(desc, "int_key"); EXPECT_EQ(2, int_value); - const auto float_value = panther_utils::GetYAMLKeyValue(desc, "float_key"); + const auto float_value = husarion_ugv_utils::GetYAMLKeyValue(desc, "float_key"); EXPECT_EQ(1.5, float_value); - const auto str_value = panther_utils::GetYAMLKeyValue(desc, "string_key"); + const auto str_value = husarion_ugv_utils::GetYAMLKeyValue(desc, "string_key"); EXPECT_EQ("string", str_value); } @@ -72,7 +74,7 @@ TEST(TestGetYAMLKeyValue, GetVectorKey) desc["int_vector_key"] = std::vector(5, 147); - const auto value_vector = panther_utils::GetYAMLKeyValue>( + const auto value_vector = husarion_ugv_utils::GetYAMLKeyValue>( desc, "int_vector_key"); for (auto value : value_vector) { EXPECT_EQ(147, value); @@ -84,7 +86,7 @@ TEST(TestGetYAMLKeyValue, GetKeyDefaultValue) YAML::Node desc; const int default_value = 54; - const auto value = panther_utils::GetYAMLKeyValue(desc, "key_name", default_value); + const auto value = husarion_ugv_utils::GetYAMLKeyValue(desc, "key_name", default_value); EXPECT_EQ(default_value, value); } diff --git a/lynx_description/launch/load_urdf.launch.py b/lynx_description/launch/load_urdf.launch.py index 6e048f9cc..cc3e6dbfc 100644 --- a/lynx_description/launch/load_urdf.launch.py +++ b/lynx_description/launch/load_urdf.launch.py @@ -72,14 +72,14 @@ def generate_launch_description(): "controller_config_path", default_value=PathJoinSubstitution( [ - FindPackageShare("panther_controller"), + FindPackageShare("husarion_ugv_controller"), "config", PythonExpression(["'", wheel_type, "_controller.yaml'"]), ] ), description=( "Path to controller configuration file. By default, it is located in" - " 'panther_controller/config/{wheel_type}_controller.yaml'. You can also specify" + " 'husarion_ugv_controller/config/{wheel_type}_controller.yaml'. You can also specify" " the path to your custom controller configuration file here. " ), ) diff --git a/lynx_description/urdf/lynx.urdf.xacro b/lynx_description/urdf/lynx.urdf.xacro index 557b8eaed..8a78c117f 100644 --- a/lynx_description/urdf/lynx.urdf.xacro +++ b/lynx_description/urdf/lynx.urdf.xacro @@ -10,7 +10,7 @@ + default="$(find husarion_ugv_controller)/config/WH05_controller.yaml" /> diff --git a/lynx_description/urdf/lynx_macro.urdf.xacro b/lynx_description/urdf/lynx_macro.urdf.xacro index 4e1fdf179..c7baa4e85 100644 --- a/lynx_description/urdf/lynx_macro.urdf.xacro +++ b/lynx_description/urdf/lynx_macro.urdf.xacro @@ -57,12 +57,12 @@ - panther_gazebo/GzPantherSystem + husarion_ugv_gazebo/EStopSystem true - panther_hardware_interfaces/LynxSystem + husarion_ugv_hardware_interfaces/LynxSystem 1600 @@ -143,7 +143,7 @@ - panther_hardware_interfaces/PantherImuSensor + husarion_ugv_hardware_interfaces/PantherImuSensor -1 0 8 diff --git a/panther/README.md b/panther/README.md deleted file mode 100644 index abc2f7d2d..000000000 --- a/panther/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# panther - -ROS 2 Metapackage composing basic functionalities of the Husarion Panther robot with VCS Tool yaml files directing to external robot dependencies. diff --git a/panther_controller/CONFIGURATION.md b/panther_controller/CONFIGURATION.md deleted file mode 100644 index f541b8727..000000000 --- a/panther_controller/CONFIGURATION.md +++ /dev/null @@ -1,9 +0,0 @@ -# panther_controller - -## Changing Velocity Smoothing Parameters - -The Panther by default uses [diff_drive_controller](https://control.ros.org/master/doc/ros2_controllers/diff_drive_controller/doc/userdoc.html) from [ros2 control](https://control.ros.org/master/index.html) or [mecanum_drive_controller](https://github.com/husarion/husarion_controllers/tree/main/mecanum_drive_controller). This controller can be customized, among others: by modifying the robot's dynamic parameters (e.g. smooth the speed or limit the robot's speed and acceleration). Its parameters can be found in the [panther_controller](https://github.com/husarion/panther_ros/tree/ros2-devel/panther_controller/config). By default, these values correspond to the upper limits of the robot's velocities and accelerations. - -## Changing Wheel Type - -Changing wheel types is possible and can be done for both the real robot and the simulation. By default, three types of wheels are supported using the launch argument `wheel_type`. If you want to use custom wheels, all you need to do is point to the new wheel and controller configuration files using the `wheel_config_path` and `controller_config_path` parameters. These files should be based on the default files, i.e. [WH01_controller.yaml](./config/WH01_controller.yaml) and [WH01.yaml](../panther_description/config/WH01.yaml). diff --git a/panther_description/launch/load_urdf.launch.py b/panther_description/launch/load_urdf.launch.py index 8a0f8ee62..1297f7c10 100644 --- a/panther_description/launch/load_urdf.launch.py +++ b/panther_description/launch/load_urdf.launch.py @@ -71,14 +71,14 @@ def generate_launch_description(): "controller_config_path", default_value=PathJoinSubstitution( [ - FindPackageShare("panther_controller"), + FindPackageShare("husarion_ugv_controller"), "config", PythonExpression(["'", wheel_type, "_controller.yaml'"]), ] ), description=( "Path to controller configuration file. By default, it is located in" - " 'panther_controller/config/{wheel_type}_controller.yaml'. You can also specify" + " 'husarion_ugv_controller/config/{wheel_type}_controller.yaml'. You can also specify" " the path to your custom controller configuration file here. " ), ) diff --git a/panther_description/urdf/gazebo.urdf.xacro b/panther_description/urdf/gazebo.urdf.xacro index 29e3558f0..2d520a1c1 100644 --- a/panther_description/urdf/gazebo.urdf.xacro +++ b/panther_description/urdf/gazebo.urdf.xacro @@ -109,7 +109,7 @@ - + ${name} ${topic} ${namespace} diff --git a/panther_description/urdf/panther.urdf.xacro b/panther_description/urdf/panther.urdf.xacro index 1c1671869..a60b84e94 100644 --- a/panther_description/urdf/panther.urdf.xacro +++ b/panther_description/urdf/panther.urdf.xacro @@ -9,7 +9,7 @@ + default="$(find husarion_ugv_controller)/config/WH01_controller.yaml" /> diff --git a/panther_description/urdf/panther_macro.urdf.xacro b/panther_description/urdf/panther_macro.urdf.xacro index de7f32ef5..ffc93fc76 100644 --- a/panther_description/urdf/panther_macro.urdf.xacro +++ b/panther_description/urdf/panther_macro.urdf.xacro @@ -56,12 +56,12 @@ - panther_gazebo/GzPantherSystem + husarion_ugv_gazebo/EStopSystem true - panther_hardware_interfaces/PantherSystem + husarion_ugv_hardware_interfaces/PantherSystem 1600 @@ -143,7 +143,7 @@ - panther_hardware_interfaces/PantherImuSensor + husarion_ugv_hardware_interfaces/PantherImuSensor -1 0 8 diff --git a/panther_lights/plugins.xml b/panther_lights/plugins.xml deleted file mode 100644 index 11f0ed750..000000000 --- a/panther_lights/plugins.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - Animation processed from an image - - - Charging animation representing percentage of battery - - From f82a2b26c489281855f627ed151597539fea0b39 Mon Sep 17 00:00:00 2001 From: rafal-gorecki Date: Tue, 24 Sep 2024 16:53:41 +0200 Subject: [PATCH 07/12] Fix simulation --- husarion_ugv_utils/husarion_ugv_utils/messages.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/husarion_ugv_utils/husarion_ugv_utils/messages.py b/husarion_ugv_utils/husarion_ugv_utils/messages.py index 33f34e226..560f1d829 100644 --- a/husarion_ugv_utils/husarion_ugv_utils/messages.py +++ b/husarion_ugv_utils/husarion_ugv_utils/messages.py @@ -63,7 +63,7 @@ def welcome_msg( additional_stats: Dict = {}, ): """Generate a welcome message with robot information and stats.""" - pkg_version = Command(command="ros2 pkg xml -t version panther") + pkg_version = Command(command="ros2 pkg xml -t version husarion_ugv") robot_model_expr = PythonExpression( [f"r'''{LYNX_TEXT}''' if '", robot_model, f"' == 'lynx' else r'''{PANTHER_TEXT}'''"] From 720bf724c59b4013cca62d823303b2fbea654b94 Mon Sep 17 00:00:00 2001 From: rafal-gorecki Date: Tue, 24 Sep 2024 17:02:48 +0200 Subject: [PATCH 08/12] PantherImu -> PhidgetImu --- .../CMakeLists.txt | 10 +- husarion_ugv_hardware_interfaces/README.md | 2 +- .../husarion_ugv_hardware_interfaces.xml | 4 +- .../phidget_imu_sensor.hpp} | 12 +- .../phidget_imu_sensor.cpp} | 88 ++++++------ .../test_phidget_imu_sensor.cpp} | 134 +++++++++--------- lynx_description/urdf/lynx_macro.urdf.xacro | 2 +- .../urdf/panther_macro.urdf.xacro | 2 +- 8 files changed, 127 insertions(+), 127 deletions(-) rename husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/{panther_imu_sensor/panther_imu_sensor.hpp => phidget_imu_sensor/phidget_imu_sensor.hpp} (93%) rename husarion_ugv_hardware_interfaces/src/{panther_imu_sensor/panther_imu_sensor.cpp => phidget_imu_sensor/phidget_imu_sensor.cpp} (87%) rename husarion_ugv_hardware_interfaces/test/{panther_imu_sensor/test_panther_imu_sensor.cpp => phidget_imu_sensor/test_phidget_imu_sensor.cpp} (80%) diff --git a/husarion_ugv_hardware_interfaces/CMakeLists.txt b/husarion_ugv_hardware_interfaces/CMakeLists.txt index 2f0d65fa2..547cd4f50 100644 --- a/husarion_ugv_hardware_interfaces/CMakeLists.txt +++ b/husarion_ugv_hardware_interfaces/CMakeLists.txt @@ -52,7 +52,7 @@ pkg_check_modules(LIBGPIOD REQUIRED IMPORTED_TARGET libgpiodcxx) add_library( ${PROJECT_NAME} SHARED - src/panther_imu_sensor/panther_imu_sensor.cpp + src/phidget_imu_sensor/phidget_imu_sensor.cpp src/panther_system/gpio/gpio_controller.cpp src/panther_system/gpio/gpio_driver.cpp src/panther_system/robot_driver/canopen_manager.cpp @@ -96,12 +96,12 @@ if(BUILD_TESTING) ament_add_gtest(${PROJECT_NAME}_test_utils test/test_utils.cpp src/utils.cpp) - ament_add_gtest(${PROJECT_NAME}_test_panther_imu_sensor - test/panther_imu_sensor/test_panther_imu_sensor.cpp) + ament_add_gtest(${PROJECT_NAME}_test_phidget_imu_sensor + test/phidget_imu_sensor/test_phidget_imu_sensor.cpp) ament_target_dependencies( - ${PROJECT_NAME}_test_panther_imu_sensor hardware_interface rclcpp + ${PROJECT_NAME}_test_phidget_imu_sensor hardware_interface rclcpp husarion_ugv_utils panther_msgs phidgets_api) - target_link_libraries(${PROJECT_NAME}_test_panther_imu_sensor ${PROJECT_NAME} + target_link_libraries(${PROJECT_NAME}_test_phidget_imu_sensor ${PROJECT_NAME} phidgets_spatial_parameters) ament_add_gtest( diff --git a/husarion_ugv_hardware_interfaces/README.md b/husarion_ugv_hardware_interfaces/README.md index 36fd86438..9908e4e70 100644 --- a/husarion_ugv_hardware_interfaces/README.md +++ b/husarion_ugv_hardware_interfaces/README.md @@ -66,7 +66,7 @@ LynxSystem additional CAN settings > [!CAUTION] > `max_write_pdo_cmds_errors_count`, `max_read_pdo_motor_states_errors_count`, `max_read_pdo_driver_state_errors_count`, `sdo_operation_timeout`, `pdo_motor_states_timeout_ms` and `pdo_driver_state_timeout_ms` are safety-critical parameters, they should be changed only in very specific cases, be sure that you know how they work and be really cautious when changing them. -### PantherImuSensor +### PhidgetImuSensor Plugin responsible for communicating with IMU and filtering data using Madgwick Filter. diff --git a/husarion_ugv_hardware_interfaces/husarion_ugv_hardware_interfaces.xml b/husarion_ugv_hardware_interfaces/husarion_ugv_hardware_interfaces.xml index b87b15050..7be01ed8b 100644 --- a/husarion_ugv_hardware_interfaces/husarion_ugv_hardware_interfaces.xml +++ b/husarion_ugv_hardware_interfaces/husarion_ugv_hardware_interfaces.xml @@ -15,8 +15,8 @@ - Hardware IMU sensor for Panther's Phidget Spatial Inertial Measurement Unit diff --git a/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_imu_sensor/panther_imu_sensor.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/phidget_imu_sensor/phidget_imu_sensor.hpp similarity index 93% rename from husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_imu_sensor/panther_imu_sensor.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/phidget_imu_sensor/phidget_imu_sensor.hpp index 640106f19..d195ca063 100644 --- a/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_imu_sensor/panther_imu_sensor.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/phidget_imu_sensor/phidget_imu_sensor.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_IMU_SENSOR_PANTHER_IMU_SENSOR_HPP_ -#define HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_IMU_SENSOR_PANTHER_IMU_SENSOR_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PHIDGET_IMU_SENSOR_PHIDGET_IMU_SENSOR_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_PHIDGET_IMU_SENSOR_PHIDGET_IMU_SENSOR_HPP_ #include #include @@ -54,10 +54,10 @@ using CommandInterface = hardware_interface::CommandInterface; /** * @brief Class that implements SensorInterface from ros2_control for Panther */ -class PantherImuSensor : public hardware_interface::SensorInterface +class PhidgetImuSensor : public hardware_interface::SensorInterface { public: - RCLCPP_SHARED_PTR_DEFINITIONS(PantherImuSensor) + RCLCPP_SHARED_PTR_DEFINITIONS(PhidgetImuSensor) CallbackReturn on_init(const hardware_interface::HardwareInfo & hardware_info) override; CallbackReturn on_configure(const rclcpp_lifecycle::State & previous_state) override; @@ -143,7 +143,7 @@ class PantherImuSensor : public hardware_interface::SensorInterface std::vector imu_sensor_state_; - rclcpp::Logger logger_{rclcpp::get_logger("PantherImuSensor")}; + rclcpp::Logger logger_{rclcpp::get_logger("PhidgetImuSensor")}; rclcpp::Clock steady_clock_{RCL_STEADY_TIME}; inline static const std::array kImuInterfacesNames = { @@ -182,4 +182,4 @@ class PantherImuSensor : public hardware_interface::SensorInterface } // namespace husarion_ugv_hardware_interfaces -#endif // HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_IMU_SENSOR_PANTHER_IMU_SENSOR_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_PHIDGET_IMU_SENSOR_PHIDGET_IMU_SENSOR_HPP_ diff --git a/husarion_ugv_hardware_interfaces/src/panther_imu_sensor/panther_imu_sensor.cpp b/husarion_ugv_hardware_interfaces/src/phidget_imu_sensor/phidget_imu_sensor.cpp similarity index 87% rename from husarion_ugv_hardware_interfaces/src/panther_imu_sensor/panther_imu_sensor.cpp rename to husarion_ugv_hardware_interfaces/src/phidget_imu_sensor/phidget_imu_sensor.cpp index 0fdf3b96a..75f9405bd 100644 --- a/husarion_ugv_hardware_interfaces/src/panther_imu_sensor/panther_imu_sensor.cpp +++ b/husarion_ugv_hardware_interfaces/src/phidget_imu_sensor/phidget_imu_sensor.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "husarion_ugv_hardware_interfaces/panther_imu_sensor/panther_imu_sensor.hpp" +#include "husarion_ugv_hardware_interfaces/phidget_imu_sensor/phidget_imu_sensor.hpp" #include #include @@ -33,7 +33,7 @@ namespace husarion_ugv_hardware_interfaces { -CallbackReturn PantherImuSensor::on_init(const hardware_interface::HardwareInfo & hardware_info) +CallbackReturn PhidgetImuSensor::on_init(const hardware_interface::HardwareInfo & hardware_info) { if (hardware_interface::SensorInterface::on_init(hardware_info) != CallbackReturn::SUCCESS) { return CallbackReturn::ERROR; @@ -52,7 +52,7 @@ CallbackReturn PantherImuSensor::on_init(const hardware_interface::HardwareInfo return CallbackReturn::SUCCESS; } -CallbackReturn PantherImuSensor::on_configure(const rclcpp_lifecycle::State &) +CallbackReturn PhidgetImuSensor::on_configure(const rclcpp_lifecycle::State &) { try { ReadObligatoryParams(); @@ -91,12 +91,12 @@ CallbackReturn PantherImuSensor::on_configure(const rclcpp_lifecycle::State &) return CallbackReturn::SUCCESS; } -CallbackReturn PantherImuSensor::on_cleanup(const rclcpp_lifecycle::State &) +CallbackReturn PhidgetImuSensor::on_cleanup(const rclcpp_lifecycle::State &) { return CallbackReturn::SUCCESS; } -CallbackReturn PantherImuSensor::on_activate(const rclcpp_lifecycle::State &) +CallbackReturn PhidgetImuSensor::on_activate(const rclcpp_lifecycle::State &) { rclcpp::NodeOptions ros_interface_options; @@ -108,9 +108,9 @@ CallbackReturn PantherImuSensor::on_activate(const rclcpp_lifecycle::State &) if (!spatial_) { spatial_ = std::make_unique( params_.serial, params_.hub_port, false, - std::bind(&PantherImuSensor::SpatialDataCallback, this, _1, _2, _3, _4), nullptr, - std::bind(&PantherImuSensor::SpatialAttachCallback, this), - std::bind(&PantherImuSensor::SpatialDetachCallback, this)); + std::bind(&PhidgetImuSensor::SpatialDataCallback, this, _1, _2, _3, _4), nullptr, + std::bind(&PhidgetImuSensor::SpatialAttachCallback, this), + std::bind(&PhidgetImuSensor::SpatialDetachCallback, this)); } imu_connected_ = true; @@ -131,22 +131,22 @@ CallbackReturn PantherImuSensor::on_activate(const rclcpp_lifecycle::State &) return CallbackReturn::SUCCESS; } -CallbackReturn PantherImuSensor::on_deactivate(const rclcpp_lifecycle::State &) +CallbackReturn PhidgetImuSensor::on_deactivate(const rclcpp_lifecycle::State &) { return CallbackReturn::SUCCESS; } -CallbackReturn PantherImuSensor::on_shutdown(const rclcpp_lifecycle::State &) +CallbackReturn PhidgetImuSensor::on_shutdown(const rclcpp_lifecycle::State &) { return CallbackReturn::SUCCESS; } -CallbackReturn PantherImuSensor::on_error(const rclcpp_lifecycle::State &) +CallbackReturn PhidgetImuSensor::on_error(const rclcpp_lifecycle::State &) { return CallbackReturn::SUCCESS; } -std::vector PantherImuSensor::export_state_interfaces() +std::vector PhidgetImuSensor::export_state_interfaces() { std::vector state_interfaces; @@ -159,7 +159,7 @@ std::vector PantherImuSensor::export_state_interfaces() return state_interfaces; } -return_type PantherImuSensor::read( +return_type PhidgetImuSensor::read( const rclcpp::Time & /* time */, const rclcpp::Duration & /* period */) { if (!imu_connected_) { @@ -168,14 +168,14 @@ return_type PantherImuSensor::read( return return_type::OK; } -void PantherImuSensor::CheckSensorName() const +void PhidgetImuSensor::CheckSensorName() const { if (!info_.sensors.size()) { throw std::runtime_error("Sensor is not defined in URDF!"); } } -void PantherImuSensor::CheckStatesSize() const +void PhidgetImuSensor::CheckStatesSize() const { if (info_.sensors.at(0).state_interfaces.size() != kImuInterfacesSize) { throw std::runtime_error( @@ -185,7 +185,7 @@ void PantherImuSensor::CheckStatesSize() const } } -void PantherImuSensor::CheckInterfaces() const +void PhidgetImuSensor::CheckInterfaces() const { const auto names_start_iter = kImuInterfacesNames.begin(); const auto names_end_iter = kImuInterfacesNames.end(); @@ -201,7 +201,7 @@ void PantherImuSensor::CheckInterfaces() const } } -void PantherImuSensor::ReadObligatoryParams() +void PhidgetImuSensor::ReadObligatoryParams() { params_.serial = std::stoi(info_.hardware_parameters.at("serial")); params_.hub_port = std::stoi(info_.hardware_parameters.at("hub_port")); @@ -215,7 +215,7 @@ void PantherImuSensor::ReadObligatoryParams() } } -void PantherImuSensor::ReadCompassParams() +void PhidgetImuSensor::ReadCompassParams() { params_.cc_mag_field = hardware_interface::stod(info_.hardware_parameters.at("cc_mag_field")); params_.cc_offset0 = hardware_interface::stod(info_.hardware_parameters.at("cc_offset0")); @@ -232,7 +232,7 @@ void PantherImuSensor::ReadCompassParams() params_.cc_t5 = hardware_interface::stod(info_.hardware_parameters.at("cc_t5")); } -void PantherImuSensor::ReadMadgwickFilterParams() +void PhidgetImuSensor::ReadMadgwickFilterParams() { params_.gain = hardware_interface::stod(info_.hardware_parameters.at("gain")); params_.zeta = hardware_interface::stod(info_.hardware_parameters.at("zeta")); @@ -247,7 +247,7 @@ void PantherImuSensor::ReadMadgwickFilterParams() CheckMadgwickFilterWorldFrameParam(); } -void PantherImuSensor::CheckMadgwickFilterWorldFrameParam() +void PhidgetImuSensor::CheckMadgwickFilterWorldFrameParam() { const auto world_frame = info_.hardware_parameters.at("world_frame"); @@ -265,13 +265,13 @@ void PantherImuSensor::CheckMadgwickFilterWorldFrameParam() } } -void PantherImuSensor::SetInitialValues() +void PhidgetImuSensor::SetInitialValues() { imu_sensor_state_.resize( info_.sensors.at(0).state_interfaces.size(), std::numeric_limits::quiet_NaN()); } -void PantherImuSensor::Calibrate() +void PhidgetImuSensor::Calibrate() { spatial_->zero(); @@ -284,12 +284,12 @@ void PantherImuSensor::Calibrate() RCLCPP_INFO(logger_, "IMU sensor calibration completed."); } -bool PantherImuSensor::IsParamDefined(const std::string & param_name) const +bool PhidgetImuSensor::IsParamDefined(const std::string & param_name) const { return info_.hardware_parameters.find(param_name) != info_.hardware_parameters.end(); } -bool PantherImuSensor::AreParamsDefined(const std::unordered_set & params_names) const +bool PhidgetImuSensor::AreParamsDefined(const std::unordered_set & params_names) const { for (const auto & param_name : params_names) { if (!IsParamDefined(param_name)) { @@ -299,7 +299,7 @@ bool PantherImuSensor::AreParamsDefined(const std::unordered_set & return true; } -void PantherImuSensor::ConfigureCompassParams() +void PhidgetImuSensor::ConfigureCompassParams() { if (AreParamsDefined( {"cc_mag_field", "cc_offset0", "cc_offset1", "cc_offset2", "cc_gain0", "cc_gain1", @@ -316,7 +316,7 @@ void PantherImuSensor::ConfigureCompassParams() } } -void PantherImuSensor::ConfigureHeating() +void PhidgetImuSensor::ConfigureHeating() { if (IsParamDefined("heating_enabled")) { params_.heating_enabled = @@ -327,7 +327,7 @@ void PantherImuSensor::ConfigureHeating() } } -void PantherImuSensor::ConfigureMadgwickFilter() +void PhidgetImuSensor::ConfigureMadgwickFilter() { filter_ = std::make_unique(); filter_->setWorldFrame(world_frame_); @@ -335,7 +335,7 @@ void PantherImuSensor::ConfigureMadgwickFilter() filter_->setDriftBiasGain(params_.zeta); } -geometry_msgs::msg::Vector3 PantherImuSensor::ParseMagnitude(const double magnetic_field[3]) +geometry_msgs::msg::Vector3 PhidgetImuSensor::ParseMagnitude(const double magnetic_field[3]) { geometry_msgs::msg::Vector3 mag_fld; @@ -352,7 +352,7 @@ geometry_msgs::msg::Vector3 PantherImuSensor::ParseMagnitude(const double magnet return mag_fld; } -geometry_msgs::msg::Vector3 PantherImuSensor::ParseGyration(const double angular_rate[3]) +geometry_msgs::msg::Vector3 PhidgetImuSensor::ParseGyration(const double angular_rate[3]) { geometry_msgs::msg::Vector3 ang_vel; @@ -362,7 +362,7 @@ geometry_msgs::msg::Vector3 PantherImuSensor::ParseGyration(const double angular return ang_vel; } -geometry_msgs::msg::Vector3 PantherImuSensor::ParseAcceleration(const double acceleration[3]) +geometry_msgs::msg::Vector3 PhidgetImuSensor::ParseAcceleration(const double acceleration[3]) { geometry_msgs::msg::Vector3 lin_acc; @@ -372,7 +372,7 @@ geometry_msgs::msg::Vector3 PantherImuSensor::ParseAcceleration(const double acc return lin_acc; } -void PantherImuSensor::InitializeMadgwickAlgorithm( +void PhidgetImuSensor::InitializeMadgwickAlgorithm( const geometry_msgs::msg::Vector3 & mag_compensated, const geometry_msgs::msg::Vector3 & lin_acc, const rclcpp::Time & timestamp) { @@ -389,7 +389,7 @@ void PantherImuSensor::InitializeMadgwickAlgorithm( algorithm_initialized_ = true; } -void PantherImuSensor::RestartMadgwickAlgorithm() +void PhidgetImuSensor::RestartMadgwickAlgorithm() { if (!filter_) { return; @@ -399,7 +399,7 @@ void PantherImuSensor::RestartMadgwickAlgorithm() filter_->setOrientation(restarted_value, restarted_value, restarted_value, restarted_value); } -bool PantherImuSensor::IsIMUCalibrated(const geometry_msgs::msg::Vector3 & mag_compensated) +bool PhidgetImuSensor::IsIMUCalibrated(const geometry_msgs::msg::Vector3 & mag_compensated) { if (imu_calibrated_) { return true; @@ -409,18 +409,18 @@ bool PantherImuSensor::IsIMUCalibrated(const geometry_msgs::msg::Vector3 & mag_c return imu_calibrated_; } -bool PantherImuSensor::IsVectorFinite(const geometry_msgs::msg::Vector3 & vec) +bool PhidgetImuSensor::IsVectorFinite(const geometry_msgs::msg::Vector3 & vec) { return std::isfinite(vec.x) && std::isfinite(vec.y) && std::isfinite(vec.z); } -bool PantherImuSensor::IsMagnitudeSynchronizedWithAccelerationAndGyration( +bool PhidgetImuSensor::IsMagnitudeSynchronizedWithAccelerationAndGyration( const geometry_msgs::msg::Vector3 & mag_compensated) { return IsVectorFinite(mag_compensated); } -void PantherImuSensor::SpatialDataCallback( +void PhidgetImuSensor::SpatialDataCallback( const double acceleration[3], const double angular_rate[3], const double magnetic_field[3], const double timestamp) { @@ -475,14 +475,14 @@ void PantherImuSensor::SpatialDataCallback( UpdateAllStatesValues(ang_vel, lin_acc); } -void PantherImuSensor::SpatialAttachCallback() +void PhidgetImuSensor::SpatialAttachCallback() { RCLCPP_INFO(logger_, "IMU sensor has successfully attached and is now connected."); imu_connected_ = true; on_activate(rclcpp_lifecycle::State{}); } -void PantherImuSensor::SpatialDetachCallback() +void PhidgetImuSensor::SpatialDetachCallback() { RCLCPP_WARN( logger_, @@ -495,7 +495,7 @@ void PantherImuSensor::SpatialDetachCallback() on_deactivate(rclcpp_lifecycle::State{}); } -void PantherImuSensor::UpdateMadgwickAlgorithm( +void PhidgetImuSensor::UpdateMadgwickAlgorithm( const geometry_msgs::msg::Vector3 & ang_vel, const geometry_msgs::msg::Vector3 & lin_acc, const geometry_msgs::msg::Vector3 & mag_compensated, const double dt) { @@ -504,7 +504,7 @@ void PantherImuSensor::UpdateMadgwickAlgorithm( mag_compensated.y, mag_compensated.z, dt); } -void PantherImuSensor::UpdateMadgwickAlgorithmIMU( +void PhidgetImuSensor::UpdateMadgwickAlgorithmIMU( const geometry_msgs::msg::Vector3 & ang_vel, const geometry_msgs::msg::Vector3 & lin_acc, const double dt) { @@ -512,7 +512,7 @@ void PantherImuSensor::UpdateMadgwickAlgorithmIMU( ang_vel.x, ang_vel.y, ang_vel.z, lin_acc.x, lin_acc.y, lin_acc.z, dt); } -void PantherImuSensor::UpdateAccelerationAndGyrationStateValues( +void PhidgetImuSensor::UpdateAccelerationAndGyrationStateValues( const geometry_msgs::msg::Vector3 & ang_vel, const geometry_msgs::msg::Vector3 & lin_acc) { imu_sensor_state_[angular_velocity_x] = ang_vel.x; @@ -532,7 +532,7 @@ void PantherImuSensor::UpdateAccelerationAndGyrationStateValues( } } -void PantherImuSensor::UpdateAllStatesValues( +void PhidgetImuSensor::UpdateAllStatesValues( const geometry_msgs::msg::Vector3 & ang_vel, const geometry_msgs::msg::Vector3 & lin_acc) { filter_->getOrientation( @@ -542,7 +542,7 @@ void PantherImuSensor::UpdateAllStatesValues( UpdateAccelerationAndGyrationStateValues(ang_vel, lin_acc); } -void PantherImuSensor::SetStateValuesToNans() +void PhidgetImuSensor::SetStateValuesToNans() { std::fill( imu_sensor_state_.begin(), imu_sensor_state_.end(), std::numeric_limits::quiet_NaN()); @@ -552,4 +552,4 @@ void PantherImuSensor::SetStateValuesToNans() #include "pluginlib/class_list_macros.hpp" PLUGINLIB_EXPORT_CLASS( - husarion_ugv_hardware_interfaces::PantherImuSensor, hardware_interface::SensorInterface) + husarion_ugv_hardware_interfaces::PhidgetImuSensor, hardware_interface::SensorInterface) diff --git a/husarion_ugv_hardware_interfaces/test/panther_imu_sensor/test_panther_imu_sensor.cpp b/husarion_ugv_hardware_interfaces/test/phidget_imu_sensor/test_phidget_imu_sensor.cpp similarity index 80% rename from husarion_ugv_hardware_interfaces/test/panther_imu_sensor/test_panther_imu_sensor.cpp rename to husarion_ugv_hardware_interfaces/test/phidget_imu_sensor/test_phidget_imu_sensor.cpp index bd738568e..ebe79ad4b 100644 --- a/husarion_ugv_hardware_interfaces/test/panther_imu_sensor/test_panther_imu_sensor.cpp +++ b/husarion_ugv_hardware_interfaces/test/phidget_imu_sensor/test_phidget_imu_sensor.cpp @@ -26,67 +26,67 @@ #include "lifecycle_msgs/msg/state.hpp" -#include "husarion_ugv_hardware_interfaces/panther_imu_sensor/panther_imu_sensor.hpp" +#include "husarion_ugv_hardware_interfaces/phidget_imu_sensor/phidget_imu_sensor.hpp" #include "husarion_ugv_utils/test/test_utils.hpp" -class PantherImuSensorWrapper : public husarion_ugv_hardware_interfaces::PantherImuSensor +class PhidgetImuSensorWrapper : public husarion_ugv_hardware_interfaces::PhidgetImuSensor { public: - PantherImuSensorWrapper() {} + PhidgetImuSensorWrapper() {} void SetHardwareInfo(const hardware_interface::HardwareInfo & info) { hardware_interface::SensorInterface::info_ = info; } - void CheckSensorName() const { PantherImuSensor::CheckSensorName(); } + void CheckSensorName() const { PhidgetImuSensor::CheckSensorName(); } - void CheckStatesSize() const { PantherImuSensor::CheckStatesSize(); } + void CheckStatesSize() const { PhidgetImuSensor::CheckStatesSize(); } - void CheckInterfaces() const { PantherImuSensor::CheckInterfaces(); } + void CheckInterfaces() const { PhidgetImuSensor::CheckInterfaces(); } - void ReadObligatoryParams() { PantherImuSensor::ReadObligatoryParams(); } + void ReadObligatoryParams() { PhidgetImuSensor::ReadObligatoryParams(); } - void ReadMadgwickFilterParams() { PantherImuSensor::ReadMadgwickFilterParams(); } + void ReadMadgwickFilterParams() { PhidgetImuSensor::ReadMadgwickFilterParams(); } - void ConfigureMadgwickFilter() { PantherImuSensor::ConfigureMadgwickFilter(); } + void ConfigureMadgwickFilter() { PhidgetImuSensor::ConfigureMadgwickFilter(); } void InitializeMadgwickAlgorithm( const geometry_msgs::msg::Vector3 & mag_compensated, const geometry_msgs::msg::Vector3 & lin_acc, const rclcpp::Time timestamp) { - PantherImuSensor::InitializeMadgwickAlgorithm(mag_compensated, lin_acc, timestamp); + PhidgetImuSensor::InitializeMadgwickAlgorithm(mag_compensated, lin_acc, timestamp); } void SpatialDataCallback( const double acceleration[3], const double angular_rate[3], const double magnetic_field[3], const double timestamp) { - PantherImuSensor::SpatialDataCallback(acceleration, angular_rate, magnetic_field, timestamp); + PhidgetImuSensor::SpatialDataCallback(acceleration, angular_rate, magnetic_field, timestamp); } - void SpatialAttachCallback() { PantherImuSensor::SpatialAttachCallback(); } + void SpatialAttachCallback() { PhidgetImuSensor::SpatialAttachCallback(); } - void SpatialDetachCallback() { PantherImuSensor::SpatialDetachCallback(); } + void SpatialDetachCallback() { PhidgetImuSensor::SpatialDetachCallback(); } geometry_msgs::msg::Vector3 ParseMagnitude(const double magnetic_field[3]) { - return PantherImuSensor::ParseMagnitude(magnetic_field); + return PhidgetImuSensor::ParseMagnitude(magnetic_field); } geometry_msgs::msg::Vector3 ParseGyration(const double angular_rate[3]) { - return PantherImuSensor::ParseGyration(angular_rate); + return PhidgetImuSensor::ParseGyration(angular_rate); } geometry_msgs::msg::Vector3 ParseAcceleration(const double acceleration[3]) { - return PantherImuSensor::ParseAcceleration(acceleration); + return PhidgetImuSensor::ParseAcceleration(acceleration); } bool IsVectorFinite(const geometry_msgs::msg::Vector3 & vec) { - return PantherImuSensor::IsVectorFinite(vec); + return PhidgetImuSensor::IsVectorFinite(vec); } bool IsQuaternionFinite(const geometry_msgs::msg::Quaternion & quat) @@ -97,43 +97,43 @@ class PantherImuSensorWrapper : public husarion_ugv_hardware_interfaces::Panther bool IsIMUCalibrated(const geometry_msgs::msg::Vector3 & vec) { - return PantherImuSensor::IsIMUCalibrated(vec); + return PhidgetImuSensor::IsIMUCalibrated(vec); } geometry_msgs::msg::Quaternion GetQuaternion() const { geometry_msgs::msg::Quaternion q; - q.x = imu_sensor_state_[PantherImuSensor::orientation_x]; - q.y = imu_sensor_state_[PantherImuSensor::orientation_y]; - q.z = imu_sensor_state_[PantherImuSensor::orientation_z]; - q.w = imu_sensor_state_[PantherImuSensor::orientation_w]; + q.x = imu_sensor_state_[PhidgetImuSensor::orientation_x]; + q.y = imu_sensor_state_[PhidgetImuSensor::orientation_y]; + q.z = imu_sensor_state_[PhidgetImuSensor::orientation_z]; + q.w = imu_sensor_state_[PhidgetImuSensor::orientation_w]; return q; } geometry_msgs::msg::Vector3 GetAcceleration() const { geometry_msgs::msg::Vector3 accel; - accel.x = imu_sensor_state_[PantherImuSensor::linear_acceleration_x]; - accel.y = imu_sensor_state_[PantherImuSensor::linear_acceleration_y]; - accel.z = imu_sensor_state_[PantherImuSensor::linear_acceleration_z]; + accel.x = imu_sensor_state_[PhidgetImuSensor::linear_acceleration_x]; + accel.y = imu_sensor_state_[PhidgetImuSensor::linear_acceleration_y]; + accel.z = imu_sensor_state_[PhidgetImuSensor::linear_acceleration_z]; return accel; } geometry_msgs::msg::Vector3 GetGyration() const { geometry_msgs::msg::Vector3 gyro; - gyro.x = imu_sensor_state_[PantherImuSensor::angular_velocity_x]; - gyro.y = imu_sensor_state_[PantherImuSensor::angular_velocity_y]; - gyro.z = imu_sensor_state_[PantherImuSensor::angular_velocity_z]; + gyro.x = imu_sensor_state_[PhidgetImuSensor::angular_velocity_x]; + gyro.y = imu_sensor_state_[PhidgetImuSensor::angular_velocity_y]; + gyro.z = imu_sensor_state_[PhidgetImuSensor::angular_velocity_z]; return gyro; } }; -class TestPantherImuSensor : public testing::Test +class TestPhidgetImuSensor : public testing::Test { public: - TestPantherImuSensor(); - ~TestPantherImuSensor(); + TestPhidgetImuSensor(); + ~TestPhidgetImuSensor(); void CreateResourceManagerFromUrdf(const std::string & urdf); @@ -206,61 +206,61 @@ class TestPantherImuSensor : public testing::Test {"world_frame", "enu"}}; inline static const std::string kPluginName = - "husarion_ugv_hardware_interfaces/PantherImuSensor"; + "husarion_ugv_hardware_interfaces/PhidgetImuSensor"; - std::unique_ptr imu_sensor_; + std::unique_ptr imu_sensor_; std::shared_ptr rm_; }; -TestPantherImuSensor::TestPantherImuSensor() +TestPhidgetImuSensor::TestPhidgetImuSensor() { - imu_sensor_ = std::make_unique(); + imu_sensor_ = std::make_unique(); rclcpp::init(0, nullptr); } -TestPantherImuSensor::~TestPantherImuSensor() { rclcpp::shutdown(); } +TestPhidgetImuSensor::~TestPhidgetImuSensor() { rclcpp::shutdown(); } -void TestPantherImuSensor::CreateResourceManagerFromUrdf(const std::string & urdf) +void TestPhidgetImuSensor::CreateResourceManagerFromUrdf(const std::string & urdf) { rm_ = std::make_shared(urdf); } -hardware_interface::return_type TestPantherImuSensor::ConfigurePantherImu() +hardware_interface::return_type TestPhidgetImuSensor::ConfigurePantherImu() { return SetState( lifecycle_msgs::msg::State::PRIMARY_STATE_INACTIVE, hardware_interface::lifecycle_state_names::INACTIVE); } -hardware_interface::return_type TestPantherImuSensor::UnconfigurePantherImu() +hardware_interface::return_type TestPhidgetImuSensor::UnconfigurePantherImu() { return SetState( lifecycle_msgs::msg::State::PRIMARY_STATE_UNCONFIGURED, hardware_interface::lifecycle_state_names::UNCONFIGURED); } -hardware_interface::return_type TestPantherImuSensor::ActivatePantherImu() +hardware_interface::return_type TestPhidgetImuSensor::ActivatePantherImu() { return SetState( lifecycle_msgs::msg::State::PRIMARY_STATE_ACTIVE, hardware_interface::lifecycle_state_names::ACTIVE); } -hardware_interface::return_type TestPantherImuSensor::DeactivatePantherImu() +hardware_interface::return_type TestPhidgetImuSensor::DeactivatePantherImu() { return SetState( lifecycle_msgs::msg::State::PRIMARY_STATE_INACTIVE, hardware_interface::lifecycle_state_names::INACTIVE); } -hardware_interface::return_type TestPantherImuSensor::ShutdownPantherImu() +hardware_interface::return_type TestPhidgetImuSensor::ShutdownPantherImu() { return SetState( lifecycle_msgs::msg::State::PRIMARY_STATE_FINALIZED, hardware_interface::lifecycle_state_names::FINALIZED); } -std::string TestPantherImuSensor::BuildUrdf( +std::string TestPhidgetImuSensor::BuildUrdf( const std::unordered_map & param_map, const std::list & interfaces_list) { @@ -286,18 +286,18 @@ std::string TestPantherImuSensor::BuildUrdf( return urdf.str(); } -std::string TestPantherImuSensor::GetDefaultPantherImuUrdf() +std::string TestPhidgetImuSensor::GetDefaultPantherImuUrdf() { return BuildUrdf(kImuObligatoryParams, kImuInterfaces); } -hardware_interface::return_type TestPantherImuSensor::SetState( +hardware_interface::return_type TestPhidgetImuSensor::SetState( const std::uint8_t state_id, const std::string & state_name) { rclcpp_lifecycle::State state(state_id, state_name); return rm_->set_component_state(kPantherImuName, state); } -hardware_interface::HardwareInfo TestPantherImuSensor::CreateExampleInterfaces( +hardware_interface::HardwareInfo TestPhidgetImuSensor::CreateExampleInterfaces( const hardware_interface::HardwareInfo & info) { hardware_interface::HardwareInfo new_info(info); @@ -312,11 +312,11 @@ hardware_interface::HardwareInfo TestPantherImuSensor::CreateExampleInterfaces( return new_info; } -hardware_interface::HardwareInfo TestPantherImuSensor::CreateCorrectInterfaces( +hardware_interface::HardwareInfo TestPhidgetImuSensor::CreateCorrectInterfaces( const hardware_interface::HardwareInfo & info) { hardware_interface::HardwareInfo new_info(info); - for (const auto & interface_name : TestPantherImuSensor::kImuInterfaces) { + for (const auto & interface_name : TestPhidgetImuSensor::kImuInterfaces) { hardware_interface::InterfaceInfo interface_info; interface_info.name = interface_name; new_info.sensors.front().state_interfaces.push_back(interface_info); @@ -324,7 +324,7 @@ hardware_interface::HardwareInfo TestPantherImuSensor::CreateCorrectInterfaces( return new_info; } -hardware_interface::HardwareInfo TestPantherImuSensor::AddMadgwickParameters( +hardware_interface::HardwareInfo TestPhidgetImuSensor::AddMadgwickParameters( const hardware_interface::HardwareInfo & info) { hardware_interface::HardwareInfo new_info(info); @@ -340,7 +340,7 @@ hardware_interface::HardwareInfo TestPantherImuSensor::AddMadgwickParameters( return new_info; } -std::list TestPantherImuSensor::ClaimGoodStateInterfaces() +std::list TestPhidgetImuSensor::ClaimGoodStateInterfaces() { std::list list; for (const auto & interface_name : kImuInterfaces) { @@ -349,7 +349,7 @@ std::list TestPantherImuSensor::ClaimG return list; } -TEST_F(TestPantherImuSensor, CheckSensorName) +TEST_F(TestPhidgetImuSensor, CheckSensorName) { hardware_interface::HardwareInfo info; imu_sensor_->SetHardwareInfo(info); @@ -363,7 +363,7 @@ TEST_F(TestPantherImuSensor, CheckSensorName) EXPECT_NO_THROW({ imu_sensor_->CheckSensorName(); }); } -TEST_F(TestPantherImuSensor, CheckStatesSize) +TEST_F(TestPhidgetImuSensor, CheckStatesSize) { hardware_interface::HardwareInfo info; info.sensors.push_back({}); @@ -377,7 +377,7 @@ TEST_F(TestPantherImuSensor, CheckStatesSize) EXPECT_NO_THROW({ imu_sensor_->CheckStatesSize(); }); } -TEST_F(TestPantherImuSensor, CheckInterfaces) +TEST_F(TestPhidgetImuSensor, CheckInterfaces) { hardware_interface::HardwareInfo info; info.sensors.push_back({}); @@ -395,25 +395,25 @@ TEST_F(TestPantherImuSensor, CheckInterfaces) EXPECT_NO_THROW({ imu_sensor_->CheckInterfaces(); }); } -TEST_F(TestPantherImuSensor, ReadObligatoryParams) +TEST_F(TestPhidgetImuSensor, ReadObligatoryParams) { hardware_interface::HardwareInfo info; info.hardware_parameters = {{"param1", "value1"}, {"param2", "value2"}}; imu_sensor_->SetHardwareInfo(info); EXPECT_THROW({ imu_sensor_->ReadObligatoryParams(); }, std::exception); - info.hardware_parameters = TestPantherImuSensor::kImuObligatoryParams; + info.hardware_parameters = TestPhidgetImuSensor::kImuObligatoryParams; info.hardware_parameters["callback_delta_epsilon_ms"] = info.hardware_parameters["data_interval_ms"]; imu_sensor_->SetHardwareInfo(info); EXPECT_THROW({ imu_sensor_->ReadObligatoryParams(); }, std::exception); - info.hardware_parameters = TestPantherImuSensor::kImuObligatoryParams; + info.hardware_parameters = TestPhidgetImuSensor::kImuObligatoryParams; imu_sensor_->SetHardwareInfo(info); EXPECT_NO_THROW({ imu_sensor_->ReadObligatoryParams(); }); } -TEST_F(TestPantherImuSensor, CheckMagnitudeWrongValueAndCalibration) +TEST_F(TestPhidgetImuSensor, CheckMagnitudeWrongValueAndCalibration) { using CallbackReturn = rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn; hardware_interface::HardwareInfo info; @@ -425,7 +425,7 @@ TEST_F(TestPantherImuSensor, CheckMagnitudeWrongValueAndCalibration) ASSERT_EQ(imu_sensor_->on_init(info), CallbackReturn::SUCCESS); double magnitude[3]; - magnitude[0] = husarion_ugv_hardware_interfaces::PantherImuSensor::KImuMagneticFieldUnknownValue; + magnitude[0] = husarion_ugv_hardware_interfaces::PhidgetImuSensor::KImuMagneticFieldUnknownValue; const auto wrong_magnitude_parsed = imu_sensor_->ParseMagnitude(magnitude); ASSERT_FALSE(imu_sensor_->IsVectorFinite(wrong_magnitude_parsed)); @@ -439,7 +439,7 @@ TEST_F(TestPantherImuSensor, CheckMagnitudeWrongValueAndCalibration) ASSERT_TRUE(imu_sensor_->IsIMUCalibrated(magnitude_parsed)); } -TEST_F(TestPantherImuSensor, CheckCalibrationOnDataCallbackAndAlgorithmInitialization) +TEST_F(TestPhidgetImuSensor, CheckCalibrationOnDataCallbackAndAlgorithmInitialization) { using CallbackReturn = rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn; hardware_interface::HardwareInfo info; @@ -451,7 +451,7 @@ TEST_F(TestPantherImuSensor, CheckCalibrationOnDataCallbackAndAlgorithmInitializ ASSERT_EQ(imu_sensor_->on_init(info), CallbackReturn::SUCCESS); double magnitude[3], acceleration[3], gyration[3]; - magnitude[0] = husarion_ugv_hardware_interfaces::PantherImuSensor::KImuMagneticFieldUnknownValue; + magnitude[0] = husarion_ugv_hardware_interfaces::PhidgetImuSensor::KImuMagneticFieldUnknownValue; const auto fake_wrong_magnitude_parsed = imu_sensor_->ParseMagnitude(magnitude); ASSERT_FALSE(imu_sensor_->IsIMUCalibrated(fake_wrong_magnitude_parsed)); @@ -481,7 +481,7 @@ TEST_F(TestPantherImuSensor, CheckCalibrationOnDataCallbackAndAlgorithmInitializ ASSERT_TRUE(imu_sensor_->IsVectorFinite(imu_sensor_->GetGyration())); } -TEST_F(TestPantherImuSensor, CheckReconnection) +TEST_F(TestPhidgetImuSensor, CheckReconnection) { using CallbackReturn = rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn; hardware_interface::HardwareInfo info; @@ -493,7 +493,7 @@ TEST_F(TestPantherImuSensor, CheckReconnection) ASSERT_EQ(imu_sensor_->on_init(info), CallbackReturn::SUCCESS); double magnitude[3], acceleration[3], gyration[3]; - magnitude[0] = husarion_ugv_hardware_interfaces::PantherImuSensor::KImuMagneticFieldUnknownValue; + magnitude[0] = husarion_ugv_hardware_interfaces::PhidgetImuSensor::KImuMagneticFieldUnknownValue; // Correct values read from sensor magnitude[0] = -0.09675; @@ -530,7 +530,7 @@ TEST_F(TestPantherImuSensor, CheckReconnection) ASSERT_TRUE(imu_sensor_->IsVectorFinite(imu_sensor_->GetGyration())); } -TEST_F(TestPantherImuSensor, CheckInterfacesLoadedByResourceManager) +TEST_F(TestPhidgetImuSensor, CheckInterfacesLoadedByResourceManager) { CreateResourceManagerFromUrdf(GetDefaultPantherImuUrdf()); @@ -551,7 +551,7 @@ TEST_F(TestPantherImuSensor, CheckInterfacesLoadedByResourceManager) EXPECT_TRUE(rm_->state_interface_exists("imu/linear_acceleration.z")); } -TEST_F(TestPantherImuSensor, CheckStatesInitialValues) +TEST_F(TestPhidgetImuSensor, CheckStatesInitialValues) { using hardware_interface::LoanedStateInterface; using hardware_interface::return_type; @@ -569,18 +569,18 @@ TEST_F(TestPantherImuSensor, CheckStatesInitialValues) EXPECT_EQ(ShutdownPantherImu(), return_type::OK); } -TEST_F(TestPantherImuSensor, CheckWrongConfigurationWithWrongParameters) +TEST_F(TestPhidgetImuSensor, CheckWrongConfigurationWithWrongParameters) { using hardware_interface::return_type; - const std::string panther_system_urdf_ = BuildUrdf({}, TestPantherImuSensor::kImuInterfaces); + const std::string panther_system_urdf_ = BuildUrdf({}, TestPhidgetImuSensor::kImuInterfaces); CreateResourceManagerFromUrdf(panther_system_urdf_); EXPECT_EQ(ConfigurePantherImu(), return_type::ERROR); EXPECT_EQ(ShutdownPantherImu(), return_type::OK); } -TEST_F(TestPantherImuSensor, CheckReadAndConfigureRealSensor) +TEST_F(TestPhidgetImuSensor, CheckReadAndConfigureRealSensor) { using hardware_interface::LoanedStateInterface; using hardware_interface::return_type; diff --git a/lynx_description/urdf/lynx_macro.urdf.xacro b/lynx_description/urdf/lynx_macro.urdf.xacro index c7baa4e85..20fc4c751 100644 --- a/lynx_description/urdf/lynx_macro.urdf.xacro +++ b/lynx_description/urdf/lynx_macro.urdf.xacro @@ -143,7 +143,7 @@ - husarion_ugv_hardware_interfaces/PantherImuSensor + husarion_ugv_hardware_interfaces/PhidgetImuSensor -1 0 8 diff --git a/panther_description/urdf/panther_macro.urdf.xacro b/panther_description/urdf/panther_macro.urdf.xacro index ffc93fc76..666f57c23 100644 --- a/panther_description/urdf/panther_macro.urdf.xacro +++ b/panther_description/urdf/panther_macro.urdf.xacro @@ -143,7 +143,7 @@ - husarion_ugv_hardware_interfaces/PantherImuSensor + husarion_ugv_hardware_interfaces/PhidgetImuSensor -1 0 8 From e0e188aac4bc6f694869cafe45aabe2020c1a1eb Mon Sep 17 00:00:00 2001 From: rafal-gorecki Date: Thu, 26 Sep 2024 10:44:58 +0200 Subject: [PATCH 09/12] Error increase frequency --- panther_lights/.docs/CHARGING_BATTERY.webp | Bin 51158 -> 27800 bytes panther_lights/.docs/ERROR.webp | Bin 37586 -> 19200 bytes panther_lights/.docs/GOAL_ACHIEVED.webp | Bin 37388 -> 19664 bytes panther_lights/CONFIGURATION.md | 2 +- panther_lights/config/lynx_animations.yaml | 6 +++++- panther_lights/config/panther_animations.yaml | 2 +- 6 files changed, 7 insertions(+), 3 deletions(-) diff --git a/panther_lights/.docs/CHARGING_BATTERY.webp b/panther_lights/.docs/CHARGING_BATTERY.webp index 8a5e8238d1040150d8466748126fe2daeb5a5c15..2711b8fb734e9c67eff675b587dffa8efc4401b0 100644 GIT binary patch literal 27800 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 literal 51158 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 Rv1ldK{{S6dQTYG> diff --git a/panther_lights/.docs/ERROR.webp b/panther_lights/.docs/ERROR.webp index c562898380fc93781a37a9080b1c3c010ea84897..cfc5f13131f2936bea847a3974034ca8feef1c41 100644 GIT binary patch literal 19200 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 Zw}DF;aWKvQo}{{}xC%A(Ji6_C`VaZ>mVN*L literal 37586 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 diff --git a/panther_lights/CONFIGURATION.md b/panther_lights/CONFIGURATION.md index df53c7dcd..2c6d64219 100644 --- a/panther_lights/CONFIGURATION.md +++ b/panther_lights/CONFIGURATION.md @@ -2,7 +2,7 @@ ## LED Animations -Basic led configuration is loaded from [`{robot_model}_animations.yaml`](config) file. It includes definition of robot panels, virtual segments and default animations. Default animations can be found in the table below: +Basic led configuration is loaded from [`{robot_model}_animations.yaml`](config) file. It includes definition of robot panels, virtual segments and default animations. The default appearance of the animation when looking at the robot from the front or back is as follows: | ID | NAME | PRIORITY | ANIMATION | | :---: | ----------------- | :------: | -------------------------------------------------- | diff --git a/panther_lights/config/lynx_animations.yaml b/panther_lights/config/lynx_animations.yaml index a697e5e38..02913ba91 100644 --- a/panther_lights/config/lynx_animations.yaml +++ b/panther_lights/config/lynx_animations.yaml @@ -22,6 +22,10 @@ segments_map: all: [fl, fr, rl, rr] front: [fl, fr] rear: [rl, rr] + fl: [fl] + fr: [fr] + rl: [rl] + rr: [rr] led_animations: - id: 0 @@ -52,7 +56,7 @@ led_animations: segments: all animation: image: $(find panther_lights)/animations/lynx/strip01_red.png - duration: 3 + duration: 2 repeat: 2 - id: 3 diff --git a/panther_lights/config/panther_animations.yaml b/panther_lights/config/panther_animations.yaml index aa766cdb4..304640a9e 100644 --- a/panther_lights/config/panther_animations.yaml +++ b/panther_lights/config/panther_animations.yaml @@ -46,7 +46,7 @@ led_animations: segments: all animation: image: $(find panther_lights)/animations/panther/strip01_red.png - duration: 3 + duration: 2 repeat: 2 - id: 3 From 5a4b5428b7e9afcc4a3f344ab58511c0c66818f5 Mon Sep 17 00:00:00 2001 From: rafal-gorecki Date: Mon, 30 Sep 2024 16:57:20 +0200 Subject: [PATCH 10/12] Fix config path --- panther_lights/test/integration/panther_lights.test.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/panther_lights/test/integration/panther_lights.test.py b/panther_lights/test/integration/panther_lights.test.py index 25fa0e95c..b3cac0a12 100644 --- a/panther_lights/test/integration/panther_lights.test.py +++ b/panther_lights/test/integration/panther_lights.test.py @@ -36,9 +36,11 @@ def generate_test_description(): - # TODO: Fix the path for specific robot model + # TODO: Should be possibility to launch integration test for specific robot animations_config_path = ( - PathJoinSubstitution([FindPackageShare("panther_lights"), "config", "animations.yaml"]), + PathJoinSubstitution( + [FindPackageShare("panther_lights"), "config", "panther_animations.yaml"] + ), ) lights_controller_node = Node( From 1c1db1809816db9271f6eb3c1f463033c5f9a578 Mon Sep 17 00:00:00 2001 From: rafal-gorecki Date: Wed, 2 Oct 2024 15:07:46 +0200 Subject: [PATCH 11/12] Fix order --- panther_lights/config/lynx_animations.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/panther_lights/config/lynx_animations.yaml b/panther_lights/config/lynx_animations.yaml index 02913ba91..872526523 100644 --- a/panther_lights/config/lynx_animations.yaml +++ b/panther_lights/config/lynx_animations.yaml @@ -7,16 +7,16 @@ panels: segments: - name: fl channel: 1 - led_range: 0-10 + led_range: 21-11 - name: rl channel: 1 - led_range: 21-11 + led_range: 0-10 - name: fr channel: 2 - led_range: 0-10 + led_range: 21-11 - name: rr channel: 2 - led_range: 21-11 + led_range: 0-10 segments_map: all: [fl, fr, rl, rr] From ca4a238687263e4fb0be8366b7b28e97b7a72586 Mon Sep 17 00:00:00 2001 From: rafal-gorecki Date: Wed, 2 Oct 2024 15:47:01 +0200 Subject: [PATCH 12/12] Rename folders: panther_system -> robot_system --- ROS_API.md | 2 +- .../CMakeLists.txt | 164 +++++++++--------- .../gpio/gpio_controller.hpp | 10 +- .../gpio/gpio_driver.hpp | 8 +- .../gpio/types.hpp | 6 +- .../lynx_system.hpp | 8 +- .../panther_system.hpp | 8 +- .../robot_driver/canopen_manager.hpp | 6 +- .../robot_driver/driver.hpp | 6 +- .../robot_driver/lynx_robot_driver.hpp | 12 +- .../robot_driver/panther_robot_driver.hpp | 12 +- .../robot_driver/robot_driver.hpp | 8 +- .../robot_driver/roboteq_data_converters.hpp | 8 +- .../robot_driver/roboteq_driver.hpp | 8 +- .../robot_driver/roboteq_error_filter.hpp | 6 +- .../robot_driver/roboteq_robot_driver.hpp | 14 +- .../system_e_stop.hpp | 12 +- .../system_ros_interface.hpp | 10 +- .../ugv_system.hpp | 18 +- .../gpio/gpio_controller.cpp | 6 +- .../gpio/gpio_driver.cpp | 2 +- .../lynx_system.cpp | 4 +- .../panther_system.cpp | 4 +- .../robot_driver/canopen_manager.cpp | 2 +- .../robot_driver/lynx_robot_driver.cpp | 6 +- .../robot_driver/panther_robot_driver.cpp | 6 +- .../robot_driver/roboteq_data_converters.cpp | 2 +- .../robot_driver/roboteq_driver.cpp | 4 +- .../robot_driver/roboteq_error_filter.cpp | 2 +- .../robot_driver/roboteq_robot_driver.cpp | 10 +- .../system_e_stop.cpp | 2 +- .../system_ros_interface.cpp | 4 +- .../ugv_system.cpp | 6 +- .../test_phidget_imu_sensor.cpp | 4 +- .../gpio/test_gpio_controller.cpp | 2 +- .../gpio/test_gpio_driver.cpp | 2 +- .../robot_driver/test_canopen_manager.cpp | 2 +- .../robot_driver/test_lynx_robot_driver.cpp | 8 +- .../test_panther_robot_driver.cpp | 8 +- .../test_roboteq_data_converters.cpp | 2 +- .../robot_driver/test_roboteq_driver.cpp | 4 +- .../test_roboteq_error_filter.cpp | 2 +- .../test_roboteq_robot_driver.cpp | 8 +- .../test_lynx_system.cpp | 4 +- .../test_panther_system.cpp | 4 +- .../test_system_ros_interface.cpp | 2 +- .../test_ugv_system.cpp | 2 +- .../test/utils/mock_driver.hpp | 2 +- .../test/utils/panther_system_test_utils.hpp | 8 +- .../test/utils/system_test_utils.hpp | 6 +- .../test/utils/test_constants.hpp | 4 +- 51 files changed, 230 insertions(+), 230 deletions(-) rename husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/{panther_system => robot_system}/gpio/gpio_controller.hpp (97%) rename husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/{panther_system => robot_system}/gpio/gpio_driver.hpp (96%) rename husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/{panther_system => robot_system}/gpio/types.hpp (91%) rename husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/{panther_system => robot_system}/lynx_system.hpp (84%) rename husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/{panther_system => robot_system}/panther_system.hpp (84%) rename husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/{panther_system => robot_system}/robot_driver/canopen_manager.hpp (93%) rename husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/{panther_system => robot_system}/robot_driver/driver.hpp (93%) rename husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/{panther_system => robot_system}/robot_driver/lynx_robot_driver.hpp (78%) rename husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/{panther_system => robot_system}/robot_driver/panther_robot_driver.hpp (79%) rename husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/{panther_system => robot_system}/robot_driver/robot_driver.hpp (89%) rename husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/{panther_system => robot_system}/robot_driver/roboteq_data_converters.hpp (95%) rename husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/{panther_system => robot_system}/robot_driver/roboteq_driver.hpp (94%) rename husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/{panther_system => robot_system}/robot_driver/roboteq_error_filter.hpp (91%) rename husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/{panther_system => robot_system}/robot_driver/roboteq_robot_driver.hpp (88%) rename husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/{panther_system => robot_system}/system_e_stop.hpp (88%) rename husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/{panther_system => robot_system}/system_ros_interface.hpp (96%) rename husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/{panther_system => robot_system}/ugv_system.hpp (89%) rename husarion_ugv_hardware_interfaces/src/{panther_system => robot_system}/gpio/gpio_controller.cpp (97%) rename husarion_ugv_hardware_interfaces/src/{panther_system => robot_system}/gpio/gpio_driver.cpp (99%) rename husarion_ugv_hardware_interfaces/src/{panther_system => robot_system}/lynx_system.cpp (97%) rename husarion_ugv_hardware_interfaces/src/{panther_system => robot_system}/panther_system.cpp (98%) rename husarion_ugv_hardware_interfaces/src/{panther_system => robot_system}/robot_driver/canopen_manager.cpp (98%) rename husarion_ugv_hardware_interfaces/src/{panther_system => robot_system}/robot_driver/lynx_robot_driver.cpp (89%) rename husarion_ugv_hardware_interfaces/src/{panther_system => robot_system}/robot_driver/panther_robot_driver.cpp (92%) rename husarion_ugv_hardware_interfaces/src/{panther_system => robot_system}/robot_driver/roboteq_data_converters.cpp (99%) rename husarion_ugv_hardware_interfaces/src/{panther_system => robot_system}/robot_driver/roboteq_driver.cpp (98%) rename husarion_ugv_hardware_interfaces/src/{panther_system => robot_system}/robot_driver/roboteq_error_filter.cpp (96%) rename husarion_ugv_hardware_interfaces/src/{panther_system => robot_system}/robot_driver/roboteq_robot_driver.cpp (94%) rename husarion_ugv_hardware_interfaces/src/{panther_system => robot_system}/system_e_stop.cpp (97%) rename husarion_ugv_hardware_interfaces/src/{panther_system => robot_system}/system_ros_interface.cpp (98%) rename husarion_ugv_hardware_interfaces/src/{panther_system => robot_system}/ugv_system.cpp (98%) rename husarion_ugv_hardware_interfaces/test/{panther_system => robot_system}/gpio/test_gpio_controller.cpp (98%) rename husarion_ugv_hardware_interfaces/test/{panther_system => robot_system}/gpio/test_gpio_driver.cpp (98%) rename husarion_ugv_hardware_interfaces/test/unit/{panther_system => robot_system}/robot_driver/test_canopen_manager.cpp (97%) rename husarion_ugv_hardware_interfaces/test/unit/{panther_system => robot_system}/robot_driver/test_lynx_robot_driver.cpp (93%) rename husarion_ugv_hardware_interfaces/test/unit/{panther_system => robot_system}/robot_driver/test_panther_robot_driver.cpp (94%) rename husarion_ugv_hardware_interfaces/test/unit/{panther_system => robot_system}/robot_driver/test_roboteq_data_converters.cpp (99%) rename husarion_ugv_hardware_interfaces/test/unit/{panther_system => robot_system}/robot_driver/test_roboteq_driver.cpp (98%) rename husarion_ugv_hardware_interfaces/test/unit/{panther_system => robot_system}/robot_driver/test_roboteq_error_filter.cpp (99%) rename husarion_ugv_hardware_interfaces/test/unit/{panther_system => robot_system}/robot_driver/test_roboteq_robot_driver.cpp (98%) rename husarion_ugv_hardware_interfaces/test/unit/{panther_system => robot_system}/test_lynx_system.cpp (98%) rename husarion_ugv_hardware_interfaces/test/unit/{panther_system => robot_system}/test_panther_system.cpp (98%) rename husarion_ugv_hardware_interfaces/test/unit/{panther_system => robot_system}/test_system_ros_interface.cpp (98%) rename husarion_ugv_hardware_interfaces/test/unit/{panther_system => robot_system}/test_ugv_system.cpp (99%) diff --git a/ROS_API.md b/ROS_API.md index 322e025d4..6a2be282c 100644 --- a/ROS_API.md +++ b/ROS_API.md @@ -46,7 +46,7 @@ Below is information about the physical robot API. For the simulation, topics an | 🤖🖥️ | `controller_manager` | The Controller Manager performs two main functions. First, it manages controllers and their required interfaces, handling tasks like loading, activating, deactivating, and unloading. Second, it interacts with hardware components, ensuring access to their interfaces. This node manages the: `imu_broadcaster`, `joint_state_broadcaster`, `drive_controller`.
*[controller_manager/controller_manager](https://github.com/ros-controls/ros2_control/blob/master/controller_manager)* | | 🤖🖥️ | `drive_controller` | Manages mobile robots with a differential or mecanum drive depending on the configuration. It converts velocity commands for the robot body into wheel commands for the base. It also calculates odometry from hardware feedback and shares it.
*[diff_drive_controller/diff_drive_controller](https://github.com/ros-controls/ros2_controllers/tree/master/diff_drive_controller) or [mecanum_drive_controller/mecanum_drive_controller](https://github.com/husarion/husarion_controllers/tree/main/mecanum_drive_controller)* | | 🤖🖥️ | `ekf_filter` | The Extended Kalman Filter node is designed to fuse odometry data from various sources, including wheel encoders, IMU, and GPS.
*[robot_localization/ekf_filter](https://github.com/cra-ros-pkg/robot_localization)* | -| 🤖 | `hardware_controller` | Plugin responsible for communicating with engine controllers via the CAN bus and providing E-Stop functionalities.
*[husarion_ugv_hardware_interfaces/{robot_model}System](./husarion_ugv_hardware_interfaces/src/panther_system/)* | +| 🤖 | `hardware_controller` | Plugin responsible for communicating with engine controllers via the CAN bus and providing E-Stop functionalities.
*[husarion_ugv_hardware_interfaces/{robot_model}System](./husarion_ugv_hardware_interfaces/src/robot_system/)* | | 🤖 | `gps` | Node responsible for parsing NMEA strings and publishing standard ROS NavSat message types.
*[nmea_navsat_driver/nmea_navsat_driver](https://github.com/ros-drivers/nmea_navsat_driver/tree/ros2/src/libnmea_navsat_driver)* | | 🖥️ | `gz_ros2_control` | Responsible for integrating the ros2_control controller architecture with the Gazebo simulator.
[gz_ros2_control/gz_ros2_control](https://github.com/ros-controls/gz_ros2_control/tree/master/gz_ros2_control/src) | | 🖥️ | `gz_estop_gui` | The node is part of the Gazebo GUI plugin, enabling easy E-stop state modifications directly within the simulation.
[husarion_ugv_gazebo/EStop](./husarion_ugv_gazebo/src/gui/e_stop.cpp) | diff --git a/husarion_ugv_hardware_interfaces/CMakeLists.txt b/husarion_ugv_hardware_interfaces/CMakeLists.txt index 547cd4f50..66d2aeff8 100644 --- a/husarion_ugv_hardware_interfaces/CMakeLists.txt +++ b/husarion_ugv_hardware_interfaces/CMakeLists.txt @@ -53,20 +53,20 @@ pkg_check_modules(LIBGPIOD REQUIRED IMPORTED_TARGET libgpiodcxx) add_library( ${PROJECT_NAME} SHARED src/phidget_imu_sensor/phidget_imu_sensor.cpp - src/panther_system/gpio/gpio_controller.cpp - src/panther_system/gpio/gpio_driver.cpp - src/panther_system/robot_driver/canopen_manager.cpp - src/panther_system/robot_driver/roboteq_data_converters.cpp - src/panther_system/robot_driver/roboteq_driver.cpp - src/panther_system/robot_driver/roboteq_error_filter.cpp - src/panther_system/robot_driver/roboteq_robot_driver.cpp - src/panther_system/robot_driver/lynx_robot_driver.cpp - src/panther_system/robot_driver/panther_robot_driver.cpp - src/panther_system/system_e_stop.cpp - src/panther_system/system_ros_interface.cpp - src/panther_system/lynx_system.cpp - src/panther_system/panther_system.cpp - src/panther_system/ugv_system.cpp + src/robot_system/gpio/gpio_controller.cpp + src/robot_system/gpio/gpio_driver.cpp + src/robot_system/robot_driver/canopen_manager.cpp + src/robot_system/robot_driver/roboteq_data_converters.cpp + src/robot_system/robot_driver/roboteq_driver.cpp + src/robot_system/robot_driver/roboteq_error_filter.cpp + src/robot_system/robot_driver/roboteq_robot_driver.cpp + src/robot_system/robot_driver/lynx_robot_driver.cpp + src/robot_system/robot_driver/panther_robot_driver.cpp + src/robot_system/system_e_stop.cpp + src/robot_system/system_ros_interface.cpp + src/robot_system/lynx_system.cpp + src/robot_system/panther_system.cpp + src/robot_system/ugv_system.cpp src/utils.cpp) ament_target_dependencies(${PROJECT_NAME} ${PACKAGE_DEPENDENCIES}) target_link_libraries(${PROJECT_NAME} PkgConfig::LIBLELY_COAPP @@ -106,13 +106,13 @@ if(BUILD_TESTING) ament_add_gtest( ${PROJECT_NAME}_test_roboteq_error_filter - test/unit/panther_system/robot_driver/test_roboteq_error_filter.cpp - src/panther_system/robot_driver/roboteq_error_filter.cpp) + test/unit/robot_system/robot_driver/test_roboteq_error_filter.cpp + src/robot_system/robot_driver/roboteq_error_filter.cpp) ament_add_gtest( ${PROJECT_NAME}_test_roboteq_data_converters - test/unit/panther_system/robot_driver/test_roboteq_data_converters.cpp - src/panther_system/robot_driver/roboteq_data_converters.cpp src/utils.cpp) + test/unit/robot_system/robot_driver/test_roboteq_data_converters.cpp + src/robot_system/robot_driver/roboteq_data_converters.cpp src/utils.cpp) target_include_directories( ${PROJECT_NAME}_test_roboteq_data_converters PUBLIC $ @@ -124,8 +124,8 @@ if(BUILD_TESTING) ament_add_gtest( ${PROJECT_NAME}_test_canopen_manager - test/unit/panther_system/robot_driver/test_canopen_manager.cpp - src/panther_system/robot_driver/canopen_manager.cpp src/utils.cpp) + test/unit/robot_system/robot_driver/test_canopen_manager.cpp + src/robot_system/robot_driver/canopen_manager.cpp src/utils.cpp) target_include_directories( ${PROJECT_NAME}_test_canopen_manager PUBLIC $ @@ -137,9 +137,9 @@ if(BUILD_TESTING) ament_add_gtest( ${PROJECT_NAME}_test_roboteq_driver - test/unit/panther_system/robot_driver/test_roboteq_driver.cpp - src/panther_system/robot_driver/canopen_manager.cpp - src/panther_system/robot_driver/roboteq_driver.cpp + test/unit/robot_system/robot_driver/test_roboteq_driver.cpp + src/robot_system/robot_driver/canopen_manager.cpp + src/robot_system/robot_driver/roboteq_driver.cpp src/utils.cpp) target_include_directories( ${PROJECT_NAME}_test_roboteq_driver @@ -152,11 +152,11 @@ if(BUILD_TESTING) ament_add_gmock( ${PROJECT_NAME}_test_roboteq_robot_driver - test/unit/panther_system/robot_driver/test_roboteq_robot_driver.cpp - src/panther_system/robot_driver/canopen_manager.cpp - src/panther_system/robot_driver/roboteq_driver.cpp - src/panther_system/robot_driver/roboteq_data_converters.cpp - src/panther_system/robot_driver/roboteq_robot_driver.cpp + test/unit/robot_system/robot_driver/test_roboteq_robot_driver.cpp + src/robot_system/robot_driver/canopen_manager.cpp + src/robot_system/robot_driver/roboteq_driver.cpp + src/robot_system/robot_driver/roboteq_data_converters.cpp + src/robot_system/robot_driver/roboteq_robot_driver.cpp src/utils.cpp) target_include_directories( ${PROJECT_NAME}_test_roboteq_robot_driver @@ -169,12 +169,12 @@ if(BUILD_TESTING) ament_add_gmock( ${PROJECT_NAME}_test_lynx_robot_driver - test/unit/panther_system/robot_driver/test_lynx_robot_driver.cpp - src/panther_system/robot_driver/canopen_manager.cpp - src/panther_system/robot_driver/roboteq_driver.cpp - src/panther_system/robot_driver/roboteq_data_converters.cpp - src/panther_system/robot_driver/roboteq_robot_driver.cpp - src/panther_system/robot_driver/lynx_robot_driver.cpp + test/unit/robot_system/robot_driver/test_lynx_robot_driver.cpp + src/robot_system/robot_driver/canopen_manager.cpp + src/robot_system/robot_driver/roboteq_driver.cpp + src/robot_system/robot_driver/roboteq_data_converters.cpp + src/robot_system/robot_driver/roboteq_robot_driver.cpp + src/robot_system/robot_driver/lynx_robot_driver.cpp src/utils.cpp) target_include_directories( ${PROJECT_NAME}_test_lynx_robot_driver @@ -187,12 +187,12 @@ if(BUILD_TESTING) ament_add_gmock( ${PROJECT_NAME}_test_panther_robot_driver - test/unit/panther_system/robot_driver/test_panther_robot_driver.cpp - src/panther_system/robot_driver/canopen_manager.cpp - src/panther_system/robot_driver/roboteq_driver.cpp - src/panther_system/robot_driver/roboteq_data_converters.cpp - src/panther_system/robot_driver/roboteq_robot_driver.cpp - src/panther_system/robot_driver/panther_robot_driver.cpp + test/unit/robot_system/robot_driver/test_panther_robot_driver.cpp + src/robot_system/robot_driver/canopen_manager.cpp + src/robot_system/robot_driver/roboteq_driver.cpp + src/robot_system/robot_driver/roboteq_data_converters.cpp + src/robot_system/robot_driver/roboteq_robot_driver.cpp + src/robot_system/robot_driver/panther_robot_driver.cpp src/utils.cpp) target_include_directories( ${PROJECT_NAME}_test_panther_robot_driver @@ -205,9 +205,9 @@ if(BUILD_TESTING) ament_add_gmock( ${PROJECT_NAME}_test_gpiod_controller - test/panther_system/gpio/test_gpio_controller.cpp - src/panther_system/gpio/gpio_controller.cpp - src/panther_system/gpio/gpio_driver.cpp) + test/robot_system/gpio/test_gpio_controller.cpp + src/robot_system/gpio/gpio_controller.cpp + src/robot_system/gpio/gpio_driver.cpp) ament_target_dependencies(${PROJECT_NAME}_test_gpiod_controller husarion_ugv_utils) target_link_libraries(${PROJECT_NAME}_test_gpiod_controller @@ -215,10 +215,10 @@ if(BUILD_TESTING) ament_add_gtest( ${PROJECT_NAME}_test_system_ros_interface - test/unit/panther_system/test_system_ros_interface.cpp - src/panther_system/system_ros_interface.cpp - src/panther_system/robot_driver/roboteq_data_converters.cpp - src/panther_system/gpio/gpio_controller.cpp + test/unit/robot_system/test_system_ros_interface.cpp + src/robot_system/system_ros_interface.cpp + src/robot_system/robot_driver/roboteq_data_converters.cpp + src/robot_system/gpio/gpio_controller.cpp src/utils.cpp) target_include_directories( ${PROJECT_NAME}_test_system_ros_interface @@ -237,14 +237,14 @@ if(BUILD_TESTING) ament_add_gmock( ${PROJECT_NAME}_test_ugv_system - test/unit/panther_system/test_ugv_system.cpp - src/panther_system/gpio/gpio_controller.cpp - src/panther_system/gpio/gpio_driver.cpp - src/panther_system/system_e_stop.cpp - src/panther_system/robot_driver/roboteq_data_converters.cpp - src/panther_system/robot_driver/roboteq_error_filter.cpp - src/panther_system/system_ros_interface.cpp - src/panther_system/ugv_system.cpp + test/unit/robot_system/test_ugv_system.cpp + src/robot_system/gpio/gpio_controller.cpp + src/robot_system/gpio/gpio_driver.cpp + src/robot_system/system_e_stop.cpp + src/robot_system/robot_driver/roboteq_data_converters.cpp + src/robot_system/robot_driver/roboteq_error_filter.cpp + src/robot_system/system_ros_interface.cpp + src/robot_system/ugv_system.cpp src/utils.cpp) set_tests_properties(${PROJECT_NAME}_test_ugv_system PROPERTIES TIMEOUT 120) target_include_directories( @@ -265,19 +265,19 @@ if(BUILD_TESTING) ament_add_gmock( ${PROJECT_NAME}_test_lynx_system - test/unit/panther_system/test_lynx_system.cpp - src/panther_system/gpio/gpio_controller.cpp - src/panther_system/gpio/gpio_driver.cpp - src/panther_system/system_e_stop.cpp - src/panther_system/robot_driver/canopen_manager.cpp - src/panther_system/robot_driver/roboteq_robot_driver.cpp - src/panther_system/robot_driver/roboteq_data_converters.cpp - src/panther_system/robot_driver/roboteq_driver.cpp - src/panther_system/robot_driver/roboteq_error_filter.cpp - src/panther_system/robot_driver/lynx_robot_driver.cpp - src/panther_system/system_ros_interface.cpp - src/panther_system/lynx_system.cpp - src/panther_system/ugv_system.cpp + test/unit/robot_system/test_lynx_system.cpp + src/robot_system/gpio/gpio_controller.cpp + src/robot_system/gpio/gpio_driver.cpp + src/robot_system/system_e_stop.cpp + src/robot_system/robot_driver/canopen_manager.cpp + src/robot_system/robot_driver/roboteq_robot_driver.cpp + src/robot_system/robot_driver/roboteq_data_converters.cpp + src/robot_system/robot_driver/roboteq_driver.cpp + src/robot_system/robot_driver/roboteq_error_filter.cpp + src/robot_system/robot_driver/lynx_robot_driver.cpp + src/robot_system/system_ros_interface.cpp + src/robot_system/lynx_system.cpp + src/robot_system/ugv_system.cpp src/utils.cpp) set_tests_properties(${PROJECT_NAME}_test_lynx_system PROPERTIES TIMEOUT 120) target_include_directories( @@ -298,19 +298,19 @@ if(BUILD_TESTING) ament_add_gmock( ${PROJECT_NAME}_test_panther_system - test/unit/panther_system/test_panther_system.cpp - src/panther_system/gpio/gpio_controller.cpp - src/panther_system/gpio/gpio_driver.cpp - src/panther_system/system_e_stop.cpp - src/panther_system/robot_driver/canopen_manager.cpp - src/panther_system/robot_driver/roboteq_robot_driver.cpp - src/panther_system/robot_driver/roboteq_data_converters.cpp - src/panther_system/robot_driver/roboteq_driver.cpp - src/panther_system/robot_driver/roboteq_error_filter.cpp - src/panther_system/robot_driver/panther_robot_driver.cpp - src/panther_system/system_ros_interface.cpp - src/panther_system/panther_system.cpp - src/panther_system/ugv_system.cpp + test/unit/robot_system/test_panther_system.cpp + src/robot_system/gpio/gpio_controller.cpp + src/robot_system/gpio/gpio_driver.cpp + src/robot_system/system_e_stop.cpp + src/robot_system/robot_driver/canopen_manager.cpp + src/robot_system/robot_driver/roboteq_robot_driver.cpp + src/robot_system/robot_driver/roboteq_data_converters.cpp + src/robot_system/robot_driver/roboteq_driver.cpp + src/robot_system/robot_driver/roboteq_error_filter.cpp + src/robot_system/robot_driver/panther_robot_driver.cpp + src/robot_system/system_ros_interface.cpp + src/robot_system/panther_system.cpp + src/robot_system/ugv_system.cpp src/utils.cpp) set_tests_properties(${PROJECT_NAME}_test_panther_system PROPERTIES TIMEOUT 120) @@ -333,7 +333,7 @@ if(BUILD_TESTING) # Integration tests option(TEST_INTEGRATION "Run integration tests" OFF) if(TEST_INTEGRATION) # Hardware integration ament_add_gtest(${PROJECT_NAME}_test_gpiod_driver - test/panther_system/gpio/test_gpio_driver.cpp) + test/robot_system/gpio/test_gpio_driver.cpp) ament_target_dependencies(${PROJECT_NAME}_test_gpiod_driver husarion_ugv_utils) target_link_libraries(${PROJECT_NAME}_test_gpiod_driver ${PROJECT_NAME} diff --git a/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/gpio/gpio_controller.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/gpio/gpio_controller.hpp similarity index 97% rename from husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/gpio/gpio_controller.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/gpio/gpio_controller.hpp index 071b8ff03..f563d2509 100644 --- a/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/gpio/gpio_controller.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/gpio/gpio_controller.hpp @@ -17,8 +17,8 @@ * @brief Header file containing a higher-level wrapper for the GPIO driver. */ -#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_GPIO_GPIO_CONTROLLER_HPP_ -#define HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_GPIO_GPIO_CONTROLLER_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_GPIO_GPIO_CONTROLLER_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_GPIO_GPIO_CONTROLLER_HPP_ #include #include @@ -31,8 +31,8 @@ #include "husarion_ugv_utils/common_utilities.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/gpio/gpio_driver.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/gpio/types.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/gpio/gpio_driver.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/gpio/types.hpp" namespace husarion_ugv_hardware_interfaces { @@ -421,4 +421,4 @@ class GPIOControllerFactory } // namespace husarion_ugv_hardware_interfaces -#endif // HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_GPIO_GPIO_CONTROLLER_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_GPIO_GPIO_CONTROLLER_HPP_ diff --git a/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/gpio/gpio_driver.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/gpio/gpio_driver.hpp similarity index 96% rename from husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/gpio/gpio_driver.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/gpio/gpio_driver.hpp index a1a194a4a..a79b29f99 100644 --- a/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/gpio/gpio_driver.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/gpio/gpio_driver.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_GPIO_GPIO_DRIVER_HPP_ -#define HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_GPIO_GPIO_DRIVER_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_GPIO_GPIO_DRIVER_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_GPIO_GPIO_DRIVER_HPP_ #include #include @@ -29,7 +29,7 @@ #include "gpiod.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/gpio/types.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/gpio/types.hpp" namespace husarion_ugv_hardware_interfaces { @@ -249,4 +249,4 @@ class GPIODriver : public GPIODriverInterface } // namespace husarion_ugv_hardware_interfaces -#endif // HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_GPIO_GPIO_DRIVER_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_GPIO_GPIO_DRIVER_HPP_ diff --git a/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/gpio/types.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/gpio/types.hpp similarity index 91% rename from husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/gpio/types.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/gpio/types.hpp index 7aef981fd..987380ba7 100644 --- a/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/gpio/types.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/gpio/types.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_GPIO_TYPES_HPP_ -#define HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_GPIO_TYPES_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_GPIO_TYPES_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_GPIO_TYPES_HPP_ #include #include @@ -85,4 +85,4 @@ struct GPIOInfo } // namespace husarion_ugv_hardware_interfaces -#endif // HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_GPIO_TYPES_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_GPIO_TYPES_HPP_ diff --git a/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/lynx_system.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/lynx_system.hpp similarity index 84% rename from husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/lynx_system.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/lynx_system.hpp index a5d12eb02..40a61823a 100644 --- a/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/lynx_system.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/lynx_system.hpp @@ -12,13 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_LYNX_SYSTEM_HPP_ -#define HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_LYNX_SYSTEM_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_LYNX_SYSTEM_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_LYNX_SYSTEM_HPP_ #include #include -#include "husarion_ugv_hardware_interfaces/panther_system/ugv_system.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/ugv_system.hpp" namespace husarion_ugv_hardware_interfaces { @@ -57,4 +57,4 @@ class LynxSystem : public UGVSystem } // namespace husarion_ugv_hardware_interfaces -#endif // HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_LYNX_SYSTEM_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_LYNX_SYSTEM_HPP_ diff --git a/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/panther_system.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/panther_system.hpp similarity index 84% rename from husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/panther_system.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/panther_system.hpp index ad2a741d7..4fcee2b79 100644 --- a/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/panther_system.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/panther_system.hpp @@ -12,13 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_PANTHER_SYSTEM_HPP_ -#define HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_PANTHER_SYSTEM_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_ROBOT_SYSTEM_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_ROBOT_SYSTEM_HPP_ #include #include -#include "husarion_ugv_hardware_interfaces/panther_system/ugv_system.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/ugv_system.hpp" namespace husarion_ugv_hardware_interfaces { @@ -57,4 +57,4 @@ class PantherSystem : public UGVSystem } // namespace husarion_ugv_hardware_interfaces -#endif // HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_PANTHER_SYSTEM_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_ROBOT_SYSTEM_HPP_ diff --git a/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/robot_driver/canopen_manager.hpp similarity index 93% rename from husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/robot_driver/canopen_manager.hpp index 7486cc5ae..8ca1fbe0b 100644 --- a/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/robot_driver/canopen_manager.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_CANOPEN_MANAGER_HPP_ -#define HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_CANOPEN_MANAGER_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_ROBOT_DRIVER_CANOPEN_MANAGER_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_ROBOT_DRIVER_CANOPEN_MANAGER_HPP_ #include #include @@ -135,4 +135,4 @@ class CANopenManager } // namespace husarion_ugv_hardware_interfaces -#endif // HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_CANOPEN_MANAGER_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_ROBOT_DRIVER_CANOPEN_MANAGER_HPP_ diff --git a/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/driver.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/robot_driver/driver.hpp similarity index 93% rename from husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/driver.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/robot_driver/driver.hpp index d124368c9..760cfde5a 100644 --- a/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/driver.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/robot_driver/driver.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_DRIVER_HPP_ -#define HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_DRIVER_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_ROBOT_DRIVER_DRIVER_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_ROBOT_DRIVER_DRIVER_HPP_ #include #include @@ -147,4 +147,4 @@ class DriverInterface } // namespace husarion_ugv_hardware_interfaces -#endif // HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_DRIVER_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_ROBOT_DRIVER_DRIVER_HPP_ diff --git a/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/lynx_robot_driver.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/robot_driver/lynx_robot_driver.hpp similarity index 78% rename from husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/lynx_robot_driver.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/robot_driver/lynx_robot_driver.hpp index e12a47078..4991373a8 100644 --- a/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/lynx_robot_driver.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/robot_driver/lynx_robot_driver.hpp @@ -12,16 +12,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_LYNX_ROBOT_DRIVER_HPP_ -#define HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_LYNX_ROBOT_DRIVER_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_ROBOT_DRIVER_LYNX_ROBOT_DRIVER_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_ROBOT_DRIVER_LYNX_ROBOT_DRIVER_HPP_ #include #include #include -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_data_converters.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/canopen_manager.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_data_converters.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_robot_driver.hpp" namespace husarion_ugv_hardware_interfaces { @@ -68,4 +68,4 @@ class LynxRobotDriver : public RoboteqRobotDriver } // namespace husarion_ugv_hardware_interfaces -#endif // HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_LYNX_ROBOT_DRIVER_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_ROBOT_DRIVER_LYNX_ROBOT_DRIVER_HPP_ diff --git a/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/panther_robot_driver.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/robot_driver/panther_robot_driver.hpp similarity index 79% rename from husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/panther_robot_driver.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/robot_driver/panther_robot_driver.hpp index 084c0c87f..d72d36f20 100644 --- a/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/panther_robot_driver.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/robot_driver/panther_robot_driver.hpp @@ -12,16 +12,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_PANTHER_ROBOT_DRIVER_HPP_ -#define HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_PANTHER_ROBOT_DRIVER_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_ROBOT_DRIVER_PANTHER_ROBOT_DRIVER_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_ROBOT_DRIVER_PANTHER_ROBOT_DRIVER_HPP_ #include #include #include -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_data_converters.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/canopen_manager.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_data_converters.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_robot_driver.hpp" namespace husarion_ugv_hardware_interfaces { @@ -70,4 +70,4 @@ class PantherRobotDriver : public RoboteqRobotDriver } // namespace husarion_ugv_hardware_interfaces -#endif // HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_PANTHER_ROBOT_DRIVER_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_ROBOT_DRIVER_PANTHER_ROBOT_DRIVER_HPP_ diff --git a/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/robot_driver.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/robot_driver/robot_driver.hpp similarity index 89% rename from husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/robot_driver.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/robot_driver/robot_driver.hpp index 214b490e2..177e61421 100644 --- a/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/robot_driver.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/robot_driver/robot_driver.hpp @@ -12,13 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOT_DRIVER_HPP_ -#define HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOT_DRIVER_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_ROBOT_DRIVER_ROBOT_DRIVER_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_ROBOT_DRIVER_ROBOT_DRIVER_HPP_ #include #include -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_data_converters.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_data_converters.hpp" namespace husarion_ugv_hardware_interfaces { @@ -118,4 +118,4 @@ class RobotDriverInterface } // namespace husarion_ugv_hardware_interfaces -#endif // HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOT_DRIVER_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_ROBOT_DRIVER_ROBOT_DRIVER_HPP_ diff --git a/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_data_converters.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_data_converters.hpp similarity index 95% rename from husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_data_converters.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_data_converters.hpp index dc7be71fb..ba3649db7 100644 --- a/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_data_converters.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_data_converters.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOTEQ_DATA_CONVERTERS_HPP_ -#define HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOTEQ_DATA_CONVERTERS_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_ROBOT_DRIVER_ROBOTEQ_DATA_CONVERTERS_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_ROBOT_DRIVER_ROBOTEQ_DATA_CONVERTERS_HPP_ #include #include @@ -25,7 +25,7 @@ #include "panther_msgs/msg/runtime_error.hpp" #include "panther_msgs/msg/script_flag.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_driver.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_driver.hpp" #include "husarion_ugv_hardware_interfaces/utils.hpp" namespace husarion_ugv_hardware_interfaces @@ -260,4 +260,4 @@ class DriverData } // namespace husarion_ugv_hardware_interfaces -#endif // HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOTEQ_DATA_CONVERTERS_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_ROBOT_DRIVER_ROBOTEQ_DATA_CONVERTERS_HPP_ diff --git a/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_driver.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_driver.hpp similarity index 94% rename from husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_driver.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_driver.hpp index 2abfa8430..729339ab7 100644 --- a/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_driver.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_driver.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOTEQ_DRIVER_HPP_ -#define HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOTEQ_DRIVER_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_ROBOT_DRIVER_ROBOTEQ_DRIVER_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_ROBOT_DRIVER_ROBOTEQ_DRIVER_HPP_ #include #include @@ -25,7 +25,7 @@ #include "lely/coapp/loop_driver.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/driver.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/driver.hpp" namespace husarion_ugv_hardware_interfaces { @@ -197,4 +197,4 @@ class RoboteqMotorDriver : public MotorDriverInterface } // namespace husarion_ugv_hardware_interfaces -#endif // HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOTEQ_DRIVER_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_ROBOT_DRIVER_ROBOTEQ_DRIVER_HPP_ diff --git a/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_error_filter.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_error_filter.hpp similarity index 91% rename from husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_error_filter.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_error_filter.hpp index 50419f7cc..063df2da8 100644 --- a/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_error_filter.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_error_filter.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOTEQ_ERROR_FILTER_HPP_ -#define HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOTEQ_ERROR_FILTER_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_ROBOT_DRIVER_ROBOTEQ_ERROR_FILTER_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_ROBOT_DRIVER_ROBOTEQ_ERROR_FILTER_HPP_ #include #include @@ -104,4 +104,4 @@ class RoboteqErrorFilter } // namespace husarion_ugv_hardware_interfaces -#endif // HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOTEQ_ERROR_FILTER_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_ROBOT_DRIVER_ROBOTEQ_ERROR_FILTER_HPP_ diff --git a/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_robot_driver.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_robot_driver.hpp similarity index 88% rename from husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_robot_driver.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_robot_driver.hpp index b788729ab..ea088a567 100644 --- a/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_robot_driver.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_robot_driver.hpp @@ -12,17 +12,17 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOTEQ_ROBOT_DRIVER_HPP_ -#define HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOTEQ_ROBOT_DRIVER_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_ROBOT_DRIVER_ROBOTEQ_ROBOT_DRIVER_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_ROBOT_DRIVER_ROBOTEQ_ROBOT_DRIVER_HPP_ #include #include #include -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/robot_driver.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_data_converters.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_driver.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/canopen_manager.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_data_converters.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_driver.hpp" namespace husarion_ugv_hardware_interfaces { @@ -172,4 +172,4 @@ class RoboteqRobotDriver : public RobotDriverInterface } // namespace husarion_ugv_hardware_interfaces -#endif // HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_ROBOT_DRIVER_ROBOTEQ_ROBOT_DRIVER_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_ROBOT_DRIVER_ROBOTEQ_ROBOT_DRIVER_HPP_ diff --git a/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/system_e_stop.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/system_e_stop.hpp similarity index 88% rename from husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/system_e_stop.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/system_e_stop.hpp index 5e12536e9..7cc903a36 100644 --- a/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/system_e_stop.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/system_e_stop.hpp @@ -12,16 +12,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_SYSTEM_E_STOP_HPP_ -#define HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_SYSTEM_E_STOP_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_SYSTEM_E_STOP_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_SYSTEM_E_STOP_HPP_ #include #include #include -#include "husarion_ugv_hardware_interfaces/panther_system/gpio/gpio_controller.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/robot_driver.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_error_filter.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/gpio/gpio_controller.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_error_filter.hpp" namespace husarion_ugv_hardware_interfaces { @@ -117,4 +117,4 @@ class EStop : public EStopInterface } // namespace husarion_ugv_hardware_interfaces -#endif // HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_SYSTEM_E_STOP_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_SYSTEM_E_STOP_HPP_ diff --git a/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/system_ros_interface.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/system_ros_interface.hpp similarity index 96% rename from husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/system_ros_interface.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/system_ros_interface.hpp index c879603a0..4b813e17b 100644 --- a/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/system_ros_interface.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/system_ros_interface.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_SYSTEM_ROS_INTERFACE_HPP_ -#define HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_SYSTEM_ROS_INTERFACE_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_SYSTEM_ROS_INTERFACE_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_SYSTEM_ROS_INTERFACE_HPP_ #include #include @@ -34,8 +34,8 @@ #include "panther_msgs/msg/io_state.hpp" #include "panther_msgs/msg/robot_driver_state.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/gpio/gpio_controller.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_data_converters.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/gpio/gpio_controller.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_data_converters.hpp" using namespace std::placeholders; @@ -310,4 +310,4 @@ class SystemROSInterface } // namespace husarion_ugv_hardware_interfaces -#endif // HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_SYSTEM_ROS_INTERFACE_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_SYSTEM_ROS_INTERFACE_HPP_ diff --git a/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/ugv_system.hpp b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/ugv_system.hpp similarity index 89% rename from husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/ugv_system.hpp rename to husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/ugv_system.hpp index ebdc0693e..d56f44a6c 100644 --- a/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/panther_system/ugv_system.hpp +++ b/husarion_ugv_hardware_interfaces/include/husarion_ugv_hardware_interfaces/robot_system/ugv_system.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_UGV_SYSTEM_HPP_ -#define HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_UGV_SYSTEM_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_UGV_SYSTEM_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_UGV_SYSTEM_HPP_ #include #include @@ -29,12 +29,12 @@ #include #include -#include "husarion_ugv_hardware_interfaces/panther_system/gpio/gpio_controller.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/robot_driver.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_error_filter.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/system_e_stop.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/system_ros_interface.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/gpio/gpio_controller.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/canopen_manager.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_error_filter.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/system_e_stop.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/system_ros_interface.hpp" namespace husarion_ugv_hardware_interfaces { @@ -165,4 +165,4 @@ class UGVSystem : public hardware_interface::SystemInterface } // namespace husarion_ugv_hardware_interfaces -#endif // HUSARION_UGV_HARDWARE_INTERFACES_PANTHER_SYSTEM_UGV_SYSTEM_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_ROBOT_SYSTEM_UGV_SYSTEM_HPP_ diff --git a/husarion_ugv_hardware_interfaces/src/panther_system/gpio/gpio_controller.cpp b/husarion_ugv_hardware_interfaces/src/robot_system/gpio/gpio_controller.cpp similarity index 97% rename from husarion_ugv_hardware_interfaces/src/panther_system/gpio/gpio_controller.cpp rename to husarion_ugv_hardware_interfaces/src/robot_system/gpio/gpio_controller.cpp index f95c14621..d2847ab7a 100644 --- a/husarion_ugv_hardware_interfaces/src/panther_system/gpio/gpio_controller.cpp +++ b/husarion_ugv_hardware_interfaces/src/robot_system/gpio/gpio_controller.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "husarion_ugv_hardware_interfaces/panther_system/gpio/gpio_controller.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/gpio/gpio_controller.hpp" #include #include @@ -24,8 +24,8 @@ #include "gpiod.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/gpio/gpio_driver.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/gpio/types.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/gpio/gpio_driver.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/gpio/types.hpp" namespace husarion_ugv_hardware_interfaces { diff --git a/husarion_ugv_hardware_interfaces/src/panther_system/gpio/gpio_driver.cpp b/husarion_ugv_hardware_interfaces/src/robot_system/gpio/gpio_driver.cpp similarity index 99% rename from husarion_ugv_hardware_interfaces/src/panther_system/gpio/gpio_driver.cpp rename to husarion_ugv_hardware_interfaces/src/robot_system/gpio/gpio_driver.cpp index 59c0d8158..d386b68db 100644 --- a/husarion_ugv_hardware_interfaces/src/panther_system/gpio/gpio_driver.cpp +++ b/husarion_ugv_hardware_interfaces/src/robot_system/gpio/gpio_driver.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "husarion_ugv_hardware_interfaces/panther_system/gpio/gpio_driver.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/gpio/gpio_driver.hpp" #include #include diff --git a/husarion_ugv_hardware_interfaces/src/panther_system/lynx_system.cpp b/husarion_ugv_hardware_interfaces/src/robot_system/lynx_system.cpp similarity index 97% rename from husarion_ugv_hardware_interfaces/src/panther_system/lynx_system.cpp rename to husarion_ugv_hardware_interfaces/src/robot_system/lynx_system.cpp index 9ea4ebbae..169f8c59c 100644 --- a/husarion_ugv_hardware_interfaces/src/panther_system/lynx_system.cpp +++ b/husarion_ugv_hardware_interfaces/src/robot_system/lynx_system.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "husarion_ugv_hardware_interfaces/panther_system/lynx_system.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/lynx_system.hpp" #include #include @@ -21,7 +21,7 @@ #include "diagnostic_updater/diagnostic_status_wrapper.hpp" #include "rclcpp/logging.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/lynx_robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/lynx_robot_driver.hpp" #include "husarion_ugv_utils/diagnostics.hpp" diff --git a/husarion_ugv_hardware_interfaces/src/panther_system/panther_system.cpp b/husarion_ugv_hardware_interfaces/src/robot_system/panther_system.cpp similarity index 98% rename from husarion_ugv_hardware_interfaces/src/panther_system/panther_system.cpp rename to husarion_ugv_hardware_interfaces/src/robot_system/panther_system.cpp index a1ea6a7c6..18a295606 100644 --- a/husarion_ugv_hardware_interfaces/src/panther_system/panther_system.cpp +++ b/husarion_ugv_hardware_interfaces/src/robot_system/panther_system.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "husarion_ugv_hardware_interfaces/panther_system/panther_system.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/panther_system.hpp" #include #include @@ -21,7 +21,7 @@ #include "diagnostic_updater/diagnostic_status_wrapper.hpp" #include "rclcpp/logging.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/panther_robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/panther_robot_driver.hpp" #include "husarion_ugv_utils/diagnostics.hpp" diff --git a/husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/canopen_manager.cpp b/husarion_ugv_hardware_interfaces/src/robot_system/robot_driver/canopen_manager.cpp similarity index 98% rename from husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/canopen_manager.cpp rename to husarion_ugv_hardware_interfaces/src/robot_system/robot_driver/canopen_manager.cpp index 09e54a8b4..4b98a7f7a 100644 --- a/husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/canopen_manager.cpp +++ b/husarion_ugv_hardware_interfaces/src/robot_system/robot_driver/canopen_manager.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/canopen_manager.hpp" #include #include diff --git a/husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/lynx_robot_driver.cpp b/husarion_ugv_hardware_interfaces/src/robot_system/robot_driver/lynx_robot_driver.cpp similarity index 89% rename from husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/lynx_robot_driver.cpp rename to husarion_ugv_hardware_interfaces/src/robot_system/robot_driver/lynx_robot_driver.cpp index e15ae280b..90abcfcaa 100644 --- a/husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/lynx_robot_driver.cpp +++ b/husarion_ugv_hardware_interfaces/src/robot_system/robot_driver/lynx_robot_driver.cpp @@ -12,15 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/lynx_robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/lynx_robot_driver.hpp" #include #include #include #include -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_driver.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_driver.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_robot_driver.hpp" namespace husarion_ugv_hardware_interfaces { diff --git a/husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/panther_robot_driver.cpp b/husarion_ugv_hardware_interfaces/src/robot_system/robot_driver/panther_robot_driver.cpp similarity index 92% rename from husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/panther_robot_driver.cpp rename to husarion_ugv_hardware_interfaces/src/robot_system/robot_driver/panther_robot_driver.cpp index d9209afcd..9fe70960d 100644 --- a/husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/panther_robot_driver.cpp +++ b/husarion_ugv_hardware_interfaces/src/robot_system/robot_driver/panther_robot_driver.cpp @@ -12,15 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/panther_robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/panther_robot_driver.hpp" #include #include #include #include -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_driver.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_driver.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_robot_driver.hpp" namespace husarion_ugv_hardware_interfaces { diff --git a/husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/roboteq_data_converters.cpp b/husarion_ugv_hardware_interfaces/src/robot_system/robot_driver/roboteq_data_converters.cpp similarity index 99% rename from husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/roboteq_data_converters.cpp rename to husarion_ugv_hardware_interfaces/src/robot_system/robot_driver/roboteq_data_converters.cpp index 1cb9788d8..e68902e31 100644 --- a/husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/roboteq_data_converters.cpp +++ b/husarion_ugv_hardware_interfaces/src/robot_system/robot_driver/roboteq_data_converters.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_data_converters.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_data_converters.hpp" #include diff --git a/husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/roboteq_driver.cpp b/husarion_ugv_hardware_interfaces/src/robot_system/robot_driver/roboteq_driver.cpp similarity index 98% rename from husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/roboteq_driver.cpp rename to husarion_ugv_hardware_interfaces/src/robot_system/robot_driver/roboteq_driver.cpp index 427324709..1e05d1fbe 100644 --- a/husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/roboteq_driver.cpp +++ b/husarion_ugv_hardware_interfaces/src/robot_system/robot_driver/roboteq_driver.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_driver.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_driver.hpp" #include #include @@ -24,7 +24,7 @@ #include #include -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/canopen_manager.hpp" #include "husarion_ugv_hardware_interfaces/utils.hpp" namespace husarion_ugv_hardware_interfaces diff --git a/husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/roboteq_error_filter.cpp b/husarion_ugv_hardware_interfaces/src/robot_system/robot_driver/roboteq_error_filter.cpp similarity index 96% rename from husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/roboteq_error_filter.cpp rename to husarion_ugv_hardware_interfaces/src/robot_system/robot_driver/roboteq_error_filter.cpp index a45b29590..81063c310 100644 --- a/husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/roboteq_error_filter.cpp +++ b/husarion_ugv_hardware_interfaces/src/robot_system/robot_driver/roboteq_error_filter.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_error_filter.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_error_filter.hpp" #include #include diff --git a/husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/roboteq_robot_driver.cpp b/husarion_ugv_hardware_interfaces/src/robot_system/robot_driver/roboteq_robot_driver.cpp similarity index 94% rename from husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/roboteq_robot_driver.cpp rename to husarion_ugv_hardware_interfaces/src/robot_system/robot_driver/roboteq_robot_driver.cpp index 7bc28775e..18a61d917 100644 --- a/husarion_ugv_hardware_interfaces/src/panther_system/robot_driver/roboteq_robot_driver.cpp +++ b/husarion_ugv_hardware_interfaces/src/robot_system/robot_driver/roboteq_robot_driver.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/robot_driver.hpp" #include #include @@ -24,10 +24,10 @@ #include "lely/util/chrono.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_data_converters.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_driver.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/canopen_manager.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_data_converters.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_driver.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_robot_driver.hpp" namespace husarion_ugv_hardware_interfaces { diff --git a/husarion_ugv_hardware_interfaces/src/panther_system/system_e_stop.cpp b/husarion_ugv_hardware_interfaces/src/robot_system/system_e_stop.cpp similarity index 97% rename from husarion_ugv_hardware_interfaces/src/panther_system/system_e_stop.cpp rename to husarion_ugv_hardware_interfaces/src/robot_system/system_e_stop.cpp index 015dedae9..969b39563 100644 --- a/husarion_ugv_hardware_interfaces/src/panther_system/system_e_stop.cpp +++ b/husarion_ugv_hardware_interfaces/src/robot_system/system_e_stop.cpp @@ -17,7 +17,7 @@ #include #include -#include "husarion_ugv_hardware_interfaces/panther_system/system_e_stop.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/system_e_stop.hpp" namespace husarion_ugv_hardware_interfaces { diff --git a/husarion_ugv_hardware_interfaces/src/panther_system/system_ros_interface.cpp b/husarion_ugv_hardware_interfaces/src/robot_system/system_ros_interface.cpp similarity index 98% rename from husarion_ugv_hardware_interfaces/src/panther_system/system_ros_interface.cpp rename to husarion_ugv_hardware_interfaces/src/robot_system/system_ros_interface.cpp index 4656ebcc7..560789d22 100644 --- a/husarion_ugv_hardware_interfaces/src/panther_system/system_ros_interface.cpp +++ b/husarion_ugv_hardware_interfaces/src/robot_system/system_ros_interface.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "husarion_ugv_hardware_interfaces/panther_system/system_ros_interface.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/system_ros_interface.hpp" #include #include @@ -22,7 +22,7 @@ #include "rclcpp/rclcpp.hpp" #include "realtime_tools/realtime_publisher.h" -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_data_converters.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_data_converters.hpp" namespace husarion_ugv_hardware_interfaces { diff --git a/husarion_ugv_hardware_interfaces/src/panther_system/ugv_system.cpp b/husarion_ugv_hardware_interfaces/src/robot_system/ugv_system.cpp similarity index 98% rename from husarion_ugv_hardware_interfaces/src/panther_system/ugv_system.cpp rename to husarion_ugv_hardware_interfaces/src/robot_system/ugv_system.cpp index f9843906b..8f24a571b 100644 --- a/husarion_ugv_hardware_interfaces/src/panther_system/ugv_system.cpp +++ b/husarion_ugv_hardware_interfaces/src/robot_system/ugv_system.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "husarion_ugv_hardware_interfaces/panther_system/ugv_system.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/ugv_system.hpp" #include #include @@ -27,8 +27,8 @@ #include #include -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/panther_robot_driver.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/system_ros_interface.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/panther_robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/system_ros_interface.hpp" #include "husarion_ugv_hardware_interfaces/utils.hpp" #include "husarion_ugv_utils/common_utilities.hpp" diff --git a/husarion_ugv_hardware_interfaces/test/phidget_imu_sensor/test_phidget_imu_sensor.cpp b/husarion_ugv_hardware_interfaces/test/phidget_imu_sensor/test_phidget_imu_sensor.cpp index ebe79ad4b..b89971f4c 100644 --- a/husarion_ugv_hardware_interfaces/test/phidget_imu_sensor/test_phidget_imu_sensor.cpp +++ b/husarion_ugv_hardware_interfaces/test/phidget_imu_sensor/test_phidget_imu_sensor.cpp @@ -573,8 +573,8 @@ TEST_F(TestPhidgetImuSensor, CheckWrongConfigurationWithWrongParameters) { using hardware_interface::return_type; - const std::string panther_system_urdf_ = BuildUrdf({}, TestPhidgetImuSensor::kImuInterfaces); - CreateResourceManagerFromUrdf(panther_system_urdf_); + const std::string robot_system_urdf_ = BuildUrdf({}, TestPhidgetImuSensor::kImuInterfaces); + CreateResourceManagerFromUrdf(robot_system_urdf_); EXPECT_EQ(ConfigurePantherImu(), return_type::ERROR); EXPECT_EQ(ShutdownPantherImu(), return_type::OK); diff --git a/husarion_ugv_hardware_interfaces/test/panther_system/gpio/test_gpio_controller.cpp b/husarion_ugv_hardware_interfaces/test/robot_system/gpio/test_gpio_controller.cpp similarity index 98% rename from husarion_ugv_hardware_interfaces/test/panther_system/gpio/test_gpio_controller.cpp rename to husarion_ugv_hardware_interfaces/test/robot_system/gpio/test_gpio_controller.cpp index a05c6fd8e..3ee2069de 100644 --- a/husarion_ugv_hardware_interfaces/test/panther_system/gpio/test_gpio_controller.cpp +++ b/husarion_ugv_hardware_interfaces/test/robot_system/gpio/test_gpio_controller.cpp @@ -20,7 +20,7 @@ #include -#include +#include using GPIOInfo = husarion_ugv_hardware_interfaces::GPIOInfo; using GPIOPin = husarion_ugv_hardware_interfaces::GPIOPin; diff --git a/husarion_ugv_hardware_interfaces/test/panther_system/gpio/test_gpio_driver.cpp b/husarion_ugv_hardware_interfaces/test/robot_system/gpio/test_gpio_driver.cpp similarity index 98% rename from husarion_ugv_hardware_interfaces/test/panther_system/gpio/test_gpio_driver.cpp rename to husarion_ugv_hardware_interfaces/test/robot_system/gpio/test_gpio_driver.cpp index f8086776f..2bff4cab8 100644 --- a/husarion_ugv_hardware_interfaces/test/panther_system/gpio/test_gpio_driver.cpp +++ b/husarion_ugv_hardware_interfaces/test/robot_system/gpio/test_gpio_driver.cpp @@ -24,7 +24,7 @@ #include #include -#include "husarion_ugv_hardware_interfaces/panther_system/gpio/gpio_driver.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/gpio/gpio_driver.hpp" #include "husarion_ugv_utils/test/test_utils.hpp" using GPIOInfo = husarion_ugv_hardware_interfaces::GPIOInfo; diff --git a/husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_canopen_manager.cpp b/husarion_ugv_hardware_interfaces/test/unit/robot_system/robot_driver/test_canopen_manager.cpp similarity index 97% rename from husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_canopen_manager.cpp rename to husarion_ugv_hardware_interfaces/test/unit/robot_system/robot_driver/test_canopen_manager.cpp index d0c54a98c..6db65c90c 100644 --- a/husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_canopen_manager.cpp +++ b/husarion_ugv_hardware_interfaces/test/unit/robot_system/robot_driver/test_canopen_manager.cpp @@ -19,7 +19,7 @@ #include #include -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/canopen_manager.hpp" #include "utils/fake_can_socket.hpp" #include "utils/test_constants.hpp" diff --git a/husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_lynx_robot_driver.cpp b/husarion_ugv_hardware_interfaces/test/unit/robot_system/robot_driver/test_lynx_robot_driver.cpp similarity index 93% rename from husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_lynx_robot_driver.cpp rename to husarion_ugv_hardware_interfaces/test/unit/robot_system/robot_driver/test_lynx_robot_driver.cpp index ba56643bf..599183870 100644 --- a/husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_lynx_robot_driver.cpp +++ b/husarion_ugv_hardware_interfaces/test/unit/robot_system/robot_driver/test_lynx_robot_driver.cpp @@ -20,10 +20,10 @@ #include -#include -#include -#include -#include +#include +#include +#include +#include #include "utils/fake_can_socket.hpp" #include "utils/mock_driver.hpp" diff --git a/husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_panther_robot_driver.cpp b/husarion_ugv_hardware_interfaces/test/unit/robot_system/robot_driver/test_panther_robot_driver.cpp similarity index 94% rename from husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_panther_robot_driver.cpp rename to husarion_ugv_hardware_interfaces/test/unit/robot_system/robot_driver/test_panther_robot_driver.cpp index f714560e7..4663958e5 100644 --- a/husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_panther_robot_driver.cpp +++ b/husarion_ugv_hardware_interfaces/test/unit/robot_system/robot_driver/test_panther_robot_driver.cpp @@ -20,10 +20,10 @@ #include -#include -#include -#include -#include +#include +#include +#include +#include #include "utils/fake_can_socket.hpp" #include "utils/mock_driver.hpp" diff --git a/husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_roboteq_data_converters.cpp b/husarion_ugv_hardware_interfaces/test/unit/robot_system/robot_driver/test_roboteq_data_converters.cpp similarity index 99% rename from husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_roboteq_data_converters.cpp rename to husarion_ugv_hardware_interfaces/test/unit/robot_system/robot_driver/test_roboteq_data_converters.cpp index 49c651223..6eecd75e6 100644 --- a/husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_roboteq_data_converters.cpp +++ b/husarion_ugv_hardware_interfaces/test/unit/robot_system/robot_driver/test_roboteq_data_converters.cpp @@ -19,7 +19,7 @@ #include -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_data_converters.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_data_converters.hpp" #include "utils/test_constants.hpp" diff --git a/husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_roboteq_driver.cpp b/husarion_ugv_hardware_interfaces/test/unit/robot_system/robot_driver/test_roboteq_driver.cpp similarity index 98% rename from husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_roboteq_driver.cpp rename to husarion_ugv_hardware_interfaces/test/unit/robot_system/robot_driver/test_roboteq_driver.cpp index 0d3a50516..9468ab79c 100644 --- a/husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_roboteq_driver.cpp +++ b/husarion_ugv_hardware_interfaces/test/unit/robot_system/robot_driver/test_roboteq_driver.cpp @@ -20,8 +20,8 @@ #include -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_driver.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/canopen_manager.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_driver.hpp" #include "utils/fake_can_socket.hpp" #include "utils/mock_roboteq.hpp" diff --git a/husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_roboteq_error_filter.cpp b/husarion_ugv_hardware_interfaces/test/unit/robot_system/robot_driver/test_roboteq_error_filter.cpp similarity index 99% rename from husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_roboteq_error_filter.cpp rename to husarion_ugv_hardware_interfaces/test/unit/robot_system/robot_driver/test_roboteq_error_filter.cpp index d02199718..b4fe4ede2 100644 --- a/husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_roboteq_error_filter.cpp +++ b/husarion_ugv_hardware_interfaces/test/unit/robot_system/robot_driver/test_roboteq_error_filter.cpp @@ -14,7 +14,7 @@ #include -#include +#include TEST(TestRoboteqErrorFilter, InitialState) { diff --git a/husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_roboteq_robot_driver.cpp b/husarion_ugv_hardware_interfaces/test/unit/robot_system/robot_driver/test_roboteq_robot_driver.cpp similarity index 98% rename from husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_roboteq_robot_driver.cpp rename to husarion_ugv_hardware_interfaces/test/unit/robot_system/robot_driver/test_roboteq_robot_driver.cpp index 77783d45f..26ee9120f 100644 --- a/husarion_ugv_hardware_interfaces/test/unit/panther_system/robot_driver/test_roboteq_robot_driver.cpp +++ b/husarion_ugv_hardware_interfaces/test/unit/robot_system/robot_driver/test_roboteq_robot_driver.cpp @@ -22,10 +22,10 @@ #include -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/canopen_manager.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/driver.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/robot_driver.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/canopen_manager.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/driver.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_robot_driver.hpp" #include "utils/fake_can_socket.hpp" #include "utils/mock_driver.hpp" diff --git a/husarion_ugv_hardware_interfaces/test/unit/panther_system/test_lynx_system.cpp b/husarion_ugv_hardware_interfaces/test/unit/robot_system/test_lynx_system.cpp similarity index 98% rename from husarion_ugv_hardware_interfaces/test/unit/panther_system/test_lynx_system.cpp rename to husarion_ugv_hardware_interfaces/test/unit/robot_system/test_lynx_system.cpp index 8f735d4ca..66da3df64 100644 --- a/husarion_ugv_hardware_interfaces/test/unit/panther_system/test_lynx_system.cpp +++ b/husarion_ugv_hardware_interfaces/test/unit/robot_system/test_lynx_system.cpp @@ -22,8 +22,8 @@ #include -#include "husarion_ugv_hardware_interfaces/panther_system/lynx_system.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/lynx_system.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_robot_driver.hpp" #include "utils/system_test_utils.hpp" #include "utils/test_constants.hpp" diff --git a/husarion_ugv_hardware_interfaces/test/unit/panther_system/test_panther_system.cpp b/husarion_ugv_hardware_interfaces/test/unit/robot_system/test_panther_system.cpp similarity index 98% rename from husarion_ugv_hardware_interfaces/test/unit/panther_system/test_panther_system.cpp rename to husarion_ugv_hardware_interfaces/test/unit/robot_system/test_panther_system.cpp index 4f48e28be..057b4b5f0 100644 --- a/husarion_ugv_hardware_interfaces/test/unit/panther_system/test_panther_system.cpp +++ b/husarion_ugv_hardware_interfaces/test/unit/robot_system/test_panther_system.cpp @@ -22,8 +22,8 @@ #include -#include "husarion_ugv_hardware_interfaces/panther_system/panther_system.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/roboteq_robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/panther_system.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/roboteq_robot_driver.hpp" #include "utils/system_test_utils.hpp" #include "utils/test_constants.hpp" diff --git a/husarion_ugv_hardware_interfaces/test/unit/panther_system/test_system_ros_interface.cpp b/husarion_ugv_hardware_interfaces/test/unit/robot_system/test_system_ros_interface.cpp similarity index 98% rename from husarion_ugv_hardware_interfaces/test/unit/panther_system/test_system_ros_interface.cpp rename to husarion_ugv_hardware_interfaces/test/unit/robot_system/test_system_ros_interface.cpp index 44cd950e3..6e3d15a11 100644 --- a/husarion_ugv_hardware_interfaces/test/unit/panther_system/test_system_ros_interface.cpp +++ b/husarion_ugv_hardware_interfaces/test/unit/robot_system/test_system_ros_interface.cpp @@ -22,7 +22,7 @@ #include -#include +#include #include "utils/test_constants.hpp" diff --git a/husarion_ugv_hardware_interfaces/test/unit/panther_system/test_ugv_system.cpp b/husarion_ugv_hardware_interfaces/test/unit/robot_system/test_ugv_system.cpp similarity index 99% rename from husarion_ugv_hardware_interfaces/test/unit/panther_system/test_ugv_system.cpp rename to husarion_ugv_hardware_interfaces/test/unit/robot_system/test_ugv_system.cpp index cbcb6f36d..3170ae533 100644 --- a/husarion_ugv_hardware_interfaces/test/unit/panther_system/test_ugv_system.cpp +++ b/husarion_ugv_hardware_interfaces/test/unit/robot_system/test_ugv_system.cpp @@ -23,7 +23,7 @@ #include #include -#include "husarion_ugv_hardware_interfaces/panther_system/ugv_system.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/ugv_system.hpp" #include "utils/system_test_utils.hpp" diff --git a/husarion_ugv_hardware_interfaces/test/utils/mock_driver.hpp b/husarion_ugv_hardware_interfaces/test/utils/mock_driver.hpp index d9da785bd..10f116746 100644 --- a/husarion_ugv_hardware_interfaces/test/utils/mock_driver.hpp +++ b/husarion_ugv_hardware_interfaces/test/utils/mock_driver.hpp @@ -22,7 +22,7 @@ #include -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/driver.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/driver.hpp" namespace husarion_ugv_hardware_interfaces_test { diff --git a/husarion_ugv_hardware_interfaces/test/utils/panther_system_test_utils.hpp b/husarion_ugv_hardware_interfaces/test/utils/panther_system_test_utils.hpp index 39cf60d76..871e912ca 100644 --- a/husarion_ugv_hardware_interfaces/test/utils/panther_system_test_utils.hpp +++ b/husarion_ugv_hardware_interfaces/test/utils/panther_system_test_utils.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef HUSARION_UGV_HARDWARE_INTERFACES_TEST_UTILS_PANTHER_SYSTEM_TEST_UTILS_HPP_ -#define HUSARION_UGV_HARDWARE_INTERFACES_TEST_UTILS_PANTHER_SYSTEM_TEST_UTILS_HPP_ +#ifndef HUSARION_UGV_HARDWARE_INTERFACES_TEST_UTILS_ROBOT_SYSTEM_TEST_UTILS_HPP_ +#define HUSARION_UGV_HARDWARE_INTERFACES_TEST_UTILS_ROBOT_SYSTEM_TEST_UTILS_HPP_ #include #include @@ -138,7 +138,7 @@ class PantherSystemTestUtils std::shared_ptr GetResourceManager() { return rm_; } std::shared_ptr GetRoboteqsMock() { return roboteqs_mock_; } - std::string GetDefaultPantherSystemUrdf() const { return default_panther_system_urdf_; } + std::string GetDefaultPantherSystemUrdf() const { return default_robot_system_urdf_; } private: /** @@ -161,4 +161,4 @@ class PantherSystemTestUtils } // namespace husarion_ugv_hardware_interfaces_test -#endif // HUSARION_UGV_HARDWARE_INTERFACES_TEST_UTILS_PANTHER_SYSTEM_TEST_UTILS_HPP_ +#endif // HUSARION_UGV_HARDWARE_INTERFACES_TEST_UTILS_ROBOT_SYSTEM_TEST_UTILS_HPP_ diff --git a/husarion_ugv_hardware_interfaces/test/utils/system_test_utils.hpp b/husarion_ugv_hardware_interfaces/test/utils/system_test_utils.hpp index 360359b4e..d9c7bcadb 100644 --- a/husarion_ugv_hardware_interfaces/test/utils/system_test_utils.hpp +++ b/husarion_ugv_hardware_interfaces/test/utils/system_test_utils.hpp @@ -22,9 +22,9 @@ #include -#include "husarion_ugv_hardware_interfaces/panther_system/gpio/gpio_controller.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/robot_driver/robot_driver.hpp" -#include "husarion_ugv_hardware_interfaces/panther_system/system_e_stop.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/gpio/gpio_controller.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/robot_driver/robot_driver.hpp" +#include "husarion_ugv_hardware_interfaces/robot_system/system_e_stop.hpp" #include "utils/mock_driver.hpp" diff --git a/husarion_ugv_hardware_interfaces/test/utils/test_constants.hpp b/husarion_ugv_hardware_interfaces/test/utils/test_constants.hpp index a25e75f60..27237d8e3 100644 --- a/husarion_ugv_hardware_interfaces/test/utils/test_constants.hpp +++ b/husarion_ugv_hardware_interfaces/test/utils/test_constants.hpp @@ -21,8 +21,8 @@ #include #include -#include -#include +#include +#include namespace husarion_ugv_hardware_interfaces_test {