From 4bb7fb63887fe0f15efa5a0925a8c77a7006b323 Mon Sep 17 00:00:00 2001 From: Jakub Delicat <109142865+delihus@users.noreply.github.com> Date: Wed, 11 Jan 2023 14:19:51 +0100 Subject: [PATCH 1/5] diff_drive base_frame_id param changed default value from `odom` -> `base_link` --- diff_drive_controller/src/diff_drive_controller_parameter.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/diff_drive_controller/src/diff_drive_controller_parameter.yaml b/diff_drive_controller/src/diff_drive_controller_parameter.yaml index 82ba210113..fb50f2fb50 100644 --- a/diff_drive_controller/src/diff_drive_controller_parameter.yaml +++ b/diff_drive_controller/src/diff_drive_controller_parameter.yaml @@ -46,7 +46,7 @@ diff_drive_controller: } base_frame_id: { type: string, - default_value: "odom", + default_value: "base_link", description: "Name of the robot's base frame that is child of the odometry frame.", } pose_covariance_diagonal: { From 3c44141ee62c7312beaf6f827e4088629a1cfdfd Mon Sep 17 00:00:00 2001 From: Jakub Delicat Date: Fri, 10 May 2024 11:32:56 +0200 Subject: [PATCH 2/5] find limits of jtc joints | added robot_description combo Signed-off-by: Jakub Delicat --- .../resource/joint_trajectory_controller.ui | 24 +++- .../joint_limits_urdf.py | 119 ++++++++++++------ .../joint_trajectory_controller.py | 44 ++++++- 3 files changed, 139 insertions(+), 48 deletions(-) diff --git a/rqt_joint_trajectory_controller/resource/joint_trajectory_controller.ui b/rqt_joint_trajectory_controller/resource/joint_trajectory_controller.ui index bc43f202e8..6d5d77556a 100644 --- a/rqt_joint_trajectory_controller/resource/joint_trajectory_controller.ui +++ b/rqt_joint_trajectory_controller/resource/joint_trajectory_controller.ui @@ -6,8 +6,8 @@ 0 0 - 336 - 317 + 616 + 594 @@ -26,8 +26,11 @@ - + + + + @@ -51,6 +54,16 @@ + + + + robot description topic + + + robot_description_combo + + + @@ -172,8 +185,8 @@ 0 0 - 314 - 109 + 566 + 300 @@ -195,6 +208,7 @@ cm_combo jtc_combo + robot_description_combo enable_button diff --git a/rqt_joint_trajectory_controller/rqt_joint_trajectory_controller/joint_limits_urdf.py b/rqt_joint_trajectory_controller/rqt_joint_trajectory_controller/joint_limits_urdf.py index 7914a76b17..1fb6bc8af0 100644 --- a/rqt_joint_trajectory_controller/rqt_joint_trajectory_controller/joint_limits_urdf.py +++ b/rqt_joint_trajectory_controller/rqt_joint_trajectory_controller/joint_limits_urdf.py @@ -23,9 +23,12 @@ from math import pi import rclpy +import rclpy.subscription from std_msgs.msg import String description = "" +robot_description_subscriber_created = False +subscription = None def callback(msg): @@ -33,8 +36,34 @@ def callback(msg): description = msg.data -def get_joint_limits(node, key="robot_description", use_smallest_joint_limits=True): +def subscribe_to_robot_description( + node, key="robot_description" +) -> rclpy.subscription.Subscription: + global robot_description_subscriber_created + global subscription + qos_profile = rclpy.qos.QoSProfile(depth=1) + qos_profile.durability = rclpy.qos.DurabilityPolicy.TRANSIENT_LOCAL + qos_profile.reliability = rclpy.qos.ReliabilityPolicy.RELIABLE + + subscription = node.create_subscription(String, key, callback, qos_profile) + robot_description_subscriber_created = True + return subscription + + +def unsubscribe_to_robot_description(node) -> rclpy.subscription.Subscription: + global subscription + if subscription is not None: + node.destroy_subscription(subscription) + + +def get_joint_limits(node, joints_names, use_smallest_joint_limits=True): + global robot_description_subscriber_created global description + + if not robot_description_subscriber_created: + print("First select robot description topic name!") + return + use_small = use_smallest_joint_limits use_mimic = True @@ -64,48 +93,56 @@ def get_joint_limits(node, key="robot_description", use_smallest_joint_limits=Tr if jtype == "fixed": continue name = child.getAttribute("name") - try: - limit = child.getElementsByTagName("limit")[0] - except IndexError: - continue - if jtype == "continuous": - minval = -pi - maxval = pi - else: + + if name in joints_names: try: - minval = float(limit.getAttribute("lower")) - maxval = float(limit.getAttribute("upper")) - except ValueError: + limit = child.getElementsByTagName("limit")[0] + try: + minval = float(limit.getAttribute("lower")) + maxval = float(limit.getAttribute("upper")) + except ValueError: + if jtype == "continuous": + minval = -pi + maxval = pi + else: + raise Exception( + f"Missing lower/upper position limits for the joint : {name} of type : {jtype} in the robot_description!" + ) + try: + maxvel = float(limit.getAttribute("velocity")) + except ValueError: + raise Exception( + f"Missing velocity limits for the joint : {name} of type : {jtype} in the robot_description!" + ) + except IndexError: + raise Exception( + f"Missing limits tag for the joint : {name} in the robot_description!" + ) + safety_tags = child.getElementsByTagName("safety_controller") + if use_small and len(safety_tags) == 1: + tag = safety_tags[0] + if tag.hasAttribute("soft_lower_limit"): + minval = max(minval, float(tag.getAttribute("soft_lower_limit"))) + if tag.hasAttribute("soft_upper_limit"): + maxval = min(maxval, float(tag.getAttribute("soft_upper_limit"))) + + mimic_tags = child.getElementsByTagName("mimic") + if use_mimic and len(mimic_tags) == 1: + tag = mimic_tags[0] + entry = {"parent": tag.getAttribute("joint")} + if tag.hasAttribute("multiplier"): + entry["factor"] = float(tag.getAttribute("multiplier")) + if tag.hasAttribute("offset"): + entry["offset"] = float(tag.getAttribute("offset")) + + dependent_joints[name] = entry continue - try: - maxvel = float(limit.getAttribute("velocity")) - except ValueError: - continue - safety_tags = child.getElementsByTagName("safety_controller") - if use_small and len(safety_tags) == 1: - tag = safety_tags[0] - if tag.hasAttribute("soft_lower_limit"): - minval = max(minval, float(tag.getAttribute("soft_lower_limit"))) - if tag.hasAttribute("soft_upper_limit"): - maxval = min(maxval, float(tag.getAttribute("soft_upper_limit"))) - - mimic_tags = child.getElementsByTagName("mimic") - if use_mimic and len(mimic_tags) == 1: - tag = mimic_tags[0] - entry = {"parent": tag.getAttribute("joint")} - if tag.hasAttribute("multiplier"): - entry["factor"] = float(tag.getAttribute("multiplier")) - if tag.hasAttribute("offset"): - entry["offset"] = float(tag.getAttribute("offset")) - - dependent_joints[name] = entry - continue - if name in dependent_joints: - continue + if name in dependent_joints: + continue - joint = {"min_position": minval, "max_position": maxval} - joint["has_position_limits"] = jtype != "continuous" - joint["max_velocity"] = maxvel - free_joints[name] = joint + joint = {"min_position": minval, "max_position": maxval} + joint["has_position_limits"] = jtype != "continuous" + joint["max_velocity"] = maxvel + free_joints[name] = joint return free_joints diff --git a/rqt_joint_trajectory_controller/rqt_joint_trajectory_controller/joint_trajectory_controller.py b/rqt_joint_trajectory_controller/rqt_joint_trajectory_controller/joint_trajectory_controller.py index 7e8ec4948e..76e5b9278e 100644 --- a/rqt_joint_trajectory_controller/rqt_joint_trajectory_controller/joint_trajectory_controller.py +++ b/rqt_joint_trajectory_controller/rqt_joint_trajectory_controller/joint_trajectory_controller.py @@ -29,7 +29,11 @@ from .utils import ControllerLister, ControllerManagerLister from .double_editor import DoubleEditor -from .joint_limits_urdf import get_joint_limits +from .joint_limits_urdf import ( + get_joint_limits, + subscribe_to_robot_description, + unsubscribe_to_robot_description, +) from .update_combo import update_combo # TODO: @@ -170,16 +174,30 @@ def __init__(self, context): self._update_jtc_list_timer.timeout.connect(self._update_jtc_list) self._update_jtc_list_timer.start() + # Timer for running controller updates + self._update_robot_description_list_timer = QTimer(self) + self._update_robot_description_list_timer.setInterval( + int(1000.0 / self._ctrlrs_update_freq) + ) + self._update_robot_description_list_timer.timeout.connect( + self._update_robot_description_list + ) + self._update_robot_description_list_timer.start() + # Signal connections w = self._widget w.enable_button.toggled.connect(self._on_jtc_enabled) w.jtc_combo.currentIndexChanged[str].connect(self._on_jtc_change) w.cm_combo.currentIndexChanged[str].connect(self._on_cm_change) + w.robot_description_combo.currentIndexChanged[str].connect( + self._on_robot_description_change + ) self._cmd_pub = None # Controller command publisher self._state_sub = None # Controller state subscriber self._list_controllers = None + self._list_robot_descriptions = None def shutdown_plugin(self): self._update_cmd_timer.stop() @@ -235,7 +253,10 @@ def _update_jtc_list(self): # for _all_ their joints running_jtc = self._running_jtc_info() if running_jtc and not self._robot_joint_limits: - self._robot_joint_limits = get_joint_limits(self._node) # Lazy evaluation + for jtc_info in running_jtc: + self._robot_joint_limits = get_joint_limits( + self._node, _jtc_joint_names(jtc_info) + ) # Lazy evaluation valid_jtc = [] if self._robot_joint_limits: for jtc_info in running_jtc: @@ -249,6 +270,18 @@ def _update_jtc_list(self): # Update widget update_combo(self._widget.jtc_combo, sorted(valid_jtc_names)) + def _update_robot_description_list(self): + if not self._list_robot_descriptions: + self._widget.robot_description_combo.clear() + self._list_robot_descriptions = [] + + topics_with_types = self._node.get_topic_names_and_types() + for topic_with_type in topics_with_types: + if "std_msgs/msg/String" in topic_with_type[1]: + self._list_robot_descriptions.append(topic_with_type[0]) + + update_combo(self._widget.robot_description_combo, sorted(self._list_robot_descriptions)) + def _on_speed_scaling_change(self, val): self._speed_scale = val / self._speed_scaling_widget.slider.maximum() @@ -269,6 +302,13 @@ def _on_cm_change(self, cm_ns): else: self._list_controllers = None + def _on_robot_description_change(self, robot_description): + unsubscribe_to_robot_description(self._node) + + subscribe_to_robot_description(self._node, robot_description) + self._widget.jtc_combo.clear() + self._update_jtc_list() + def _on_jtc_change(self, jtc_name): self._unload_jtc() self._jtc_name = jtc_name From 4573ef7b3d147769e476d38b65f7c66e17485015 Mon Sep 17 00:00:00 2001 From: Jakub Delicat Date: Fri, 10 May 2024 11:59:45 +0200 Subject: [PATCH 3/5] removed unignored caches Signed-off-by: Jakub Delicat --- .../__pycache__/__init__.cpython-310.pyc | Bin 212 -> 0 bytes .../__pycache__/double_editor.cpython-310.pyc | Bin 2675 -> 0 bytes .../joint_limits_urdf.cpython-310.pyc | Bin 3124 -> 0 bytes .../joint_trajectory_controller.cpython-310.pyc | Bin 15077 -> 0 bytes ..._joint_trajectory_controller.cpython-310.pyc | Bin 388 -> 0 bytes .../__pycache__/update_combo.cpython-310.pyc | Bin 1674 -> 0 bytes .../__pycache__/utils.cpython-310.pyc | Bin 11876 -> 0 bytes 7 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 rqt_joint_trajectory_controller/rqt_joint_trajectory_controller/__pycache__/__init__.cpython-310.pyc delete mode 100644 rqt_joint_trajectory_controller/rqt_joint_trajectory_controller/__pycache__/double_editor.cpython-310.pyc delete mode 100644 rqt_joint_trajectory_controller/rqt_joint_trajectory_controller/__pycache__/joint_limits_urdf.cpython-310.pyc delete mode 100644 rqt_joint_trajectory_controller/rqt_joint_trajectory_controller/__pycache__/joint_trajectory_controller.cpython-310.pyc delete mode 100644 rqt_joint_trajectory_controller/rqt_joint_trajectory_controller/__pycache__/rqt_joint_trajectory_controller.cpython-310.pyc delete mode 100644 rqt_joint_trajectory_controller/rqt_joint_trajectory_controller/__pycache__/update_combo.cpython-310.pyc delete mode 100644 rqt_joint_trajectory_controller/rqt_joint_trajectory_controller/__pycache__/utils.cpython-310.pyc diff --git a/rqt_joint_trajectory_controller/rqt_joint_trajectory_controller/__pycache__/__init__.cpython-310.pyc b/rqt_joint_trajectory_controller/rqt_joint_trajectory_controller/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index c6a401c2147101fc323a9fd114c78d92b0ee2431..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212 zcmd1j<>g`kf^wUnR1p0bL?8o3AjbiSi&=m~3PUi1CZpdP|^e0*kJW=VX!UP0w84x8Nkl+v73JCK8lnScZf0|2)1JV5{e diff --git a/rqt_joint_trajectory_controller/rqt_joint_trajectory_controller/__pycache__/double_editor.cpython-310.pyc b/rqt_joint_trajectory_controller/rqt_joint_trajectory_controller/__pycache__/double_editor.cpython-310.pyc deleted file mode 100644 index 61afdd61eebc68d0c1bec34173db59d737b78515..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2675 zcmai0-EP}96ecCvRvg=LldR2}t@W@DgRwOkhFuoJuyz|T3>n&V>);zg5t&4eEV-n# zHi3Jy6zFTnmwAglhi-S(R~R;6-=XXzZURgOj}CcA>if9pN$GCVIHJW)4S82gJl zmmd$EZ_vz75RyqAvjM%Gn2(%+!%25zcjOH`t9x;6R3Fr>UW*$ef8cZW1Cw>xc+F%( z`KRt+N%CFR_upbiw$tb3=7Gw@I0%n|10~F1pp}r3R$-RvW0>o48pvNF(srYRB#5Ck z9zTmDmW8y(<;R_M%x_Q>8*s@6j^qPZd8&5G2lY2>pG!x&ul+$odb0MK4g3lnaQSix z{ibZnWxSVVOSbWD$&OsXyZwfFY|sJrZrOU2=6kXFPDVg^GHLekRFHbvVUYELI8I-f zUY7P0reI9WZu0Xui&Bt`k9#KH8^Q~;2{u!@ z7bLQmkH^sV(mau7%dQCLoQXQctA<8n=1+)>ow9;Y8D|qdagLZ-{*nE`p)=u397s3w zhP9%eH6%Z^o|(F@+{~Z26LyODPS|j%Xp*O<^WL(oPdO~kgl|;#*0g%Jr)-05LKhvZ zTPd3K&Dpw@Vi{u{yApd2yTuLkS7-f|S%0nS7i)xAGWfc&Q{L6jGchDriA)FN6J&-6 z(y65u1j&Ia+t79q%~NVuQ1Ag# z>cWIUtgvK^5ACHd%a%=shljLYmJLuzz^YsoX(FoqML09A*)c4{y7^$=D?Ov)eftTE zmp)o4c_j9uSe@~5Nr*5Gj1l6D{XN+}Oh;;4syNzyl!p08C7IdQsrmAfBhB_+9>sF| zfBgNw_QfEKk97;4`wGq6gJ|-WTX*Z6nuDMBZ?o2MTl^01;MaA#u%EnlxxlvOu?i^; z^M`cG^@nKYHU#pCn$7N^Q@E6k>+BY?=#205J>A9}eT&2@iJK68M}LSH+=+a#t(6uGxZ35;gjz#?m zru1uNO;d$m;JmqQ)D-20ve_eiZcQH0sO6m&T^CYV14()+yi6V*4i8_S` zS6H$$ie$Z(uKpZ|K$qC*`y_0_ZIQN3;xiINPk%w;I(8qx5TIFhC>g$r26nxx>=qA) zE9vKA7n^?HLa|9_2_CunE>%o{`*B8y74AHig=g=K%5F(g9H~|0YM01e@FLLHvLV)o zXogOLj*XNLHr_w)6grMl8~cSAQF>BZS`rj&3mcc(yk49OFnw+d`rTZiAf#xv9Gd)O zb-{}^7yB!8CnUj0;ZA4@F-m0~lim{Ic^t;%p4UP@1G z9b!XH2+H>CNDfsTV~dM~{)i^uBTTkF&!x*_!>8GWOCcZ&afKSLhz5;hw7Qv5hO^TaUAcsa6%S&Fjq7KOCc} fU@VMF3@jI7Q2Gxl*L_WKvjO+JC{Bk8blv?AHd=|$ diff --git a/rqt_joint_trajectory_controller/rqt_joint_trajectory_controller/__pycache__/joint_limits_urdf.cpython-310.pyc b/rqt_joint_trajectory_controller/rqt_joint_trajectory_controller/__pycache__/joint_limits_urdf.cpython-310.pyc deleted file mode 100644 index 62901c5316d0a76c4e7cb4e644e56b4520b0f5b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3124 zcmai0OK%&=5uTn0Ih+~3DckZx9zTFAbC8f15G0Nf?@9|8aJXxWNU}l_V#FRwLk&4} zPtz8KA+U&i4Y0Z7l58N};=ho;kbltEoE8Z317c*IuX`w&ULna4UES4HU0qdOtg573 zb~Jq7`R7jtpIz0oze{BGGlBdRBRv728YQu|M=w`sJl$eR`rTeX8FQAzamdoG{b>}_ zE%u!EhDkK$J~z(PJ{*g^Gk6 z$QTkEOX2%rk0-rLvcCnM)B~tk9`Q&`H;GA@kBv*QDHT@FavckfKhKmf7mg=fTM+qY z+Es&DAh&gP1Cwasy%Be_a}$lGCMvnLanDJ~z2OL=;hjnusb(Vb-vaS-qlK+rtvp4vcfTM=f5? ztc6K5uAfyhWo)F)3m8RSrG+Eo3&Ni9+OR%soHcoMLC#vVxFFPC*XDL+57)M}FUYUG zc_}LmuV7rAYOM2o8>?%ybfn|-)2wv1PMrmrI~lUdkDcqI=Voq3UO)zWdeX&i ziw%`I8;bh9B^8*WZh+d%ikbUB!<)HTQN7edtjk%2-u{z5Zz;bUS&RDMtzy1| zxs?@`X9~zucRMHF{y1VO_tP*&GWOL!)n7@MK2Ii5-ya8~@J^Ri5ap~2aMD16|3+qI zvhpF#$$ci%pRiQ67ABufLSYS};N^FFN1(ufp%0b1rY^!NDaBL_G}#Azv+NqLwBD-cxq;a^r+$gr{OD?a3%j#riZw{T!jYKtWmdE&1z<(gi7Bst07Z<@N4> zg<;N}iW(Y#5IUga$wjk!lE+d;;~yfUmC1U@K9Ktb=<*_nF$c#Na~KPE8CM9pR2YDW z5g9T)wP8U#o3Z;+jO@u)Dsc@Sdr$KpgP#5Yz%*@CT@$spQpl^YqcBImMm)nKIx4e6 zY|IXEbe&YNs*nbDZBoEb*K4SU=GXeabzAQ0MB@5e^Q~veGji>iHE=tml@GlItO8!i z-yk-mO398cW#XpK(FObps*` zdrgg(a@s?unr;H*aVz6g#lPwlmYvYPX&gS3SuWiG bu-9OLZo?|+Pm|b&UNGMlbm!|vrBe70|6g~s diff --git a/rqt_joint_trajectory_controller/rqt_joint_trajectory_controller/__pycache__/joint_trajectory_controller.cpython-310.pyc b/rqt_joint_trajectory_controller/rqt_joint_trajectory_controller/__pycache__/joint_trajectory_controller.cpython-310.pyc deleted file mode 100644 index 02751ef3733915c1bc65897972ef5ca8248bf9c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15077 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 G#r^^6dFTQF diff --git a/rqt_joint_trajectory_controller/rqt_joint_trajectory_controller/__pycache__/utils.cpython-310.pyc b/rqt_joint_trajectory_controller/rqt_joint_trajectory_controller/__pycache__/utils.cpython-310.pyc deleted file mode 100644 index 72e334cb7c3a56053c4a323933f9fa61ee6d528c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11876 zcmd5?&2!vFb_Xz+;c!G!)F(wzjv;GfaV#$BY}RoiYZZBE(Pm0ZIV6>2$5Bw=G)RJ) z0Y(iBWl}R$TP3F~S5CR+BwkYG^KMlthx`Tk4{%5h$;COPDmNW=^LwxHHA7O?GF!39 z0;bU)uV24@U;SPO6-WfO4H(o_#=Z{o&zruNwYCcl9 zx3uT_m)e*5rXkAQYEbL@1jl@?KO^p`I65Y+S@`?djV#)6E7-K0X5{U<6(C?j&$02{Y`5n?P5LIcBN}Yfz=9vN7iN_kAMg`H2WQ5t|F8$l12EQ z??s-|vbVZ!7~Zs&)u+XugmJX(9*=c02iVbTI<3~8)qFYtuWxxFLkPN2r>iJnb)>uN z1>Ml1A+(5S8@<|Yv>k{!M$PdB4eW;QX17I)^{tL8y+EY1Y`e`zp1-A5zU}y1ZfJQv z&y-MF!8wlF3Ep>GZrk;vWGrUn!B0G(wMA&jpu4qgIabTr-?Mg|mM6RjYoyt&StqoD zPA3RmfiCC_#t%km>)uWkX8l_ zxcOzYupPAB1>v^5g^z+}m$!OB2H}qiIxAe*=z1-&ARkBePT={G9Z6@$ZAO9ID|GwT z_HN|0!uif#T)RbRG=p~M_I+9it?H7tf8!W3%-?DSkc03x3hB5*R4D@nQ{^obm@4B; z6@6EiMx;Sq>CcRuKD>O;Pu}K>ck0f;CF>(@3@(f;|;$hU^((2{7 zESs&)o+K1vbA^VzX@@Ov|DJu!vf@g}OoVwxGtCx{5AdEsv&3NKd7Ak&y$FYR>KM2` zLSslh%(GQ}Odl)N^vmT-dex9Ks2tG!r1vX$7V(6i;MLRnM$eG7o+0#U_$-e~asp-J zeXS27zR(Y}kFRp zO?p1*xNNzW`#Grxr2un{pY8*TFc{92o6!1+(qGS2p|uSSLqZ=wg>1WyAh8c!d^oKm z#Glcb4SbhWCAX9IX}hE_>aSr^podwpDOGT+(MWZ~y6n0Z)_tk z!Jiz(RxPd9OYx~@+YVj1>%k_*<|B76j8EC{r)>9gNJ>~Y73WN&e_TdiKa8u?OeiUK zCM}_O`YcKh@F?CHo79PW&g&K3_>E~uY8~L65mXTWFz@^Y3O((Gb^t!v()y(yto=i) zZwfuqr?h^#SMHetUIbLstSY@QdgTM1>iU&lMU);H@|w_5F1;xADhIl*J+Ah^Pj%Dz z82W)1|8c=fSbo|GA{Zvv<^J);H>Z8-GOUAJl)~pWvY{}x9oH97=WxHat>vdmZu@f< z8Cha4wWF!NCq8vNKV+O<50B8=aGMT{wdF;Y2*B`u5D^!`FKJs2LxOEr##9;4#IJyW zK+|GsvSwgcWu}%ROFFmfAtS#Nw=0#PdthP` z>DMFjz-Aw9Yguw6S=1Pu70-|gP2`7VBDAsP>Z}o8uDpsRq$m{r&vs8D600tYRs$9j>YWf@0gK>BhrN6@ylDktqWx_`| ztCQZB)Y8N=@JF0>2Tw>Yma8>DfCl^oL^G;<0@Nv{Au5PEl*I@*YBZk8&!0b2Cw`J> zSm(8j)dGLl^*z^z_rBTn$*1HK3pwn2HEi_J)d?TkSgM1Vkbt6v>x0@gctA_&){0xcy>rB>HD)qqc6L@Py3jAifL>h zoUfPIzmjGGf~zXxg@Xk8pT@5RnWUxqya$Bt)usRW(zujg6UH+eF2{AJOX$ zo^TGY0r9J);x`J#o(iC-LJ%ur6jVGFPv%UONZ<^(f*A@eua-axKtc5uXbx#|GGz}z z$pRNdDJ5rct5R{si5=b#MJfb~9iIR=q~Th^+uTH$#*Y}4!W5fc3!+J|7!1pnv+H;* zX9M!XaSTkMXn&M&&2va;`Dwy2{Q~-kN#HC(W^3{3h9m6_Cv+E3=pQAJSuijhkW59y z+3TA@V9Q`5h>i$MULO=#;<;udTY#gaHU~W<+6m5SZ$%1wV-NlVA|SIVpgHS$(sO90 zbUZCCnK6e!3!hDUP%FR`sgS^WdG3f69nvhB2)_fCOyYz30cn^L%%g$Rp*aP?w#)EG zDhE^=p)+FL+<%lQv*8$CA%us0DzHQv1tecLfCdU=vhnQd@rIJ@aey#$1E?)NlS5(s z=1P|2m3mcP0OHDyk`{`~9CDFApz~pkgByF9YtH_W;72@O_881o)+JW9j{PYFrxl`%s2goM$ z^cN!s+D>&%lkcK)eN_GwKXHwfmJ{yzO-T^rkySE>@NsCx@#V1N`F0n_r}TcVhq?se7b%G&uNw zOyK^6UN`CW0ljjqPJj!O<*NM_8vX^3@~%j=j~lgWd8{m{Wof{fCqbeJ)*_z&p(6s> zLjfPNXFQ{DisAe!^_Z4eGZqDd)q--85Z26hhn@69MiMC_f#*%TS+Lg-7K*HrR${4C zK6Rn%XF1F?GNUp#IStncL=q!aL3tie(lam>RSZv}I;HM+f@yMM>TaMOW&jaa9R4Bt z98|$Cv|#YW3e$G@0XSiyV*&Uf5Lpx@3*+VsfH6rRu*(^$gAPnqj&T~f{jI2h7$TPZ zH8Ny&u7sT^l8D}nW;9NU)HOamgm;0tNF?Hk91ivWFJc)I@riNy=lD66ujHSh^@N;6 z+V#8TB*I{Tlc=Jw*-T2+>HEq_ImRdCBmyAs(Jq$c3Vsr<;p$KE{R&Q@J};@uD!m@y z^{ssJ&nM70tVzCGMqv~NIE8D5StaTAedUz`&L?A*GD8^PmKw{5sy~WdPUnh6O%Dc8 z{PI`B{6cO`YOlg|d~ncLL(umcg_w4z^acf&qGi}Z>EpTbt zSRDI(<<=C};f0)tbzvCKG+U0>M$`&kXwa3E+&G)gk<&xI4aP$lj8vg)(2KY_uJZ8; zhtk+2hL6WmAc*uv!z%Jh&hv*SxD4(KDduO6SK-CNgX6dH>zYYl#;*~XEy=$@hbDQg z=^tfhGU3?82ZY1ykx2ZQG9fG+^T>1{cGlIx^N7G!c1R4~@8Jf;!>RsAuQaChtGyA_ z8xWl9y^?%e82u{5ruz6|uN3}Jl=w@>R~6$-X=~1|hi{AUMA;Pc)-n={sZThUB!&1u z1s5^vhVUOQHv~Rn)`)n7t|O7l5fsp5aB0{g(*_K->lXmStu1=+hcTrPV@u@%ho<NRI5;1)`B7 zOo=ceM?$Z|B$>q^3sGIHY|av#X``@Cpsu3e#t4$6IOs1vRcEFDb{+{MMZn>qOg|ExoOa1PC#7G` ztwcKp_J5_HIvy8ToS*;ytpG6sR(sYWrgje$u`n7lV4;qQKDRC z6P*Vv=72l-30gCYNls)*Ug+WW3GNW!3J>hzdDuHRm3&9QOzV3FEa=r@OOI@zzW+gD z`_#=7@(ogn%yf^3>usq>Uk9Ut%Qw0aZW$soGJ+H_)g;bFJi^|E=f|T|%Xt8hi;4ip z4hT~;F45;u4C-fCnM>57n>>`|H90zF{9?jLvb@v-aW?WG5P({$8!JooD=K6+b4=J_ z9%()m`{JnO#lu avR12Jt6r#HotT-Js{ODw$^SDG@BT0IJk6p2 From 982a0827e7103b36e37ead8063e34cb9b8c8bef8 Mon Sep 17 00:00:00 2001 From: Jakub Delicat Date: Wed, 12 Jun 2024 10:46:05 +0200 Subject: [PATCH 4/5] Changed interval Signed-off-by: Jakub Delicat --- .../joint_trajectory_controller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rqt_joint_trajectory_controller/rqt_joint_trajectory_controller/joint_trajectory_controller.py b/rqt_joint_trajectory_controller/rqt_joint_trajectory_controller/joint_trajectory_controller.py index 56be3dc4d1..e87bdffb2c 100644 --- a/rqt_joint_trajectory_controller/rqt_joint_trajectory_controller/joint_trajectory_controller.py +++ b/rqt_joint_trajectory_controller/rqt_joint_trajectory_controller/joint_trajectory_controller.py @@ -177,7 +177,7 @@ def __init__(self, context): # Timer for running controller updates self._update_robot_description_list_timer = QTimer(self) self._update_robot_description_list_timer.setInterval( - int(1000.0 / self._ctrlrs_update_freq) + int(1.0 / self._ctrlrs_update_freq) ) self._update_robot_description_list_timer.timeout.connect( self._update_robot_description_list From 73293082eb405c426b832360ca4af7ac07740a65 Mon Sep 17 00:00:00 2001 From: Jakub Delicat Date: Wed, 12 Jun 2024 11:29:25 +0200 Subject: [PATCH 5/5] aplied pre-commit Signed-off-by: Jakub Delicat --- .../joint_trajectory_controller.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/rqt_joint_trajectory_controller/rqt_joint_trajectory_controller/joint_trajectory_controller.py b/rqt_joint_trajectory_controller/rqt_joint_trajectory_controller/joint_trajectory_controller.py index e87bdffb2c..bdea23b279 100644 --- a/rqt_joint_trajectory_controller/rqt_joint_trajectory_controller/joint_trajectory_controller.py +++ b/rqt_joint_trajectory_controller/rqt_joint_trajectory_controller/joint_trajectory_controller.py @@ -176,9 +176,7 @@ def __init__(self, context): # Timer for running controller updates self._update_robot_description_list_timer = QTimer(self) - self._update_robot_description_list_timer.setInterval( - int(1.0 / self._ctrlrs_update_freq) - ) + self._update_robot_description_list_timer.setInterval(int(1.0 / self._ctrlrs_update_freq)) self._update_robot_description_list_timer.timeout.connect( self._update_robot_description_list )