|
16 | 16 | import rclpy
|
17 | 17 | from rclpy.duration import Duration
|
18 | 18 | from rclpy.executors import MultiThreadedExecutor
|
19 |
| -from rclpy.callback_groups import MutuallyExclusiveCallbackGroup |
| 19 | +from rclpy.callback_groups import MutuallyExclusiveCallbackGroup, ReentrantCallbackGroup |
20 | 20 | from rclpy.node import Node
|
21 | 21 | from rclpy.parameter import Parameter
|
22 | 22 |
|
@@ -970,12 +970,13 @@ def ros_setup(self):
|
970 | 970 | self.is_gamepad_dongle_pub = self.create_publisher(Bool,'is_gamepad_dongle', 1)
|
971 | 971 | self.gamepad_state_pub = self.create_publisher(Joy,'stretch_gamepad_state', 1) # decode using gamepad_conversion.unpack_joy_to_gamepad_state() on client side
|
972 | 972 |
|
973 |
| - self.group = MutuallyExclusiveCallbackGroup() |
974 |
| - self.create_subscription(Twist, "cmd_vel", self.set_mobile_base_velocity_callback, 1, callback_group=self.group) |
| 973 | + self.main_group = ReentrantCallbackGroup() |
| 974 | + self.mutex_group = MutuallyExclusiveCallbackGroup() |
| 975 | + self.create_subscription(Twist, "cmd_vel", self.set_mobile_base_velocity_callback, 1, callback_group=self.main_group) |
975 | 976 |
|
976 |
| - self.create_subscription(Joy, "gamepad_joy", self.set_gamepad_motion_callback, 1, callback_group=self.group) |
| 977 | + self.create_subscription(Joy, "gamepad_joy", self.set_gamepad_motion_callback, 1, callback_group=self.main_group) |
977 | 978 |
|
978 |
| - self.create_subscription(Float64MultiArray, "joint_pose_cmd", self.set_robot_streaming_position_callback, 1, callback_group=self.group) |
| 979 | + self.create_subscription(Float64MultiArray, "joint_pose_cmd", self.set_robot_streaming_position_callback, 1, callback_group=self.main_group) |
979 | 980 |
|
980 | 981 | self.declare_parameter('rate', 30.0)
|
981 | 982 | self.joint_state_rate = self.get_parameter('rate').value
|
@@ -1019,56 +1020,68 @@ def ros_setup(self):
|
1019 | 1020 |
|
1020 | 1021 | self.switch_to_navigation_mode_service = self.create_service(Trigger,
|
1021 | 1022 | '/switch_to_navigation_mode',
|
1022 |
| - self.navigation_mode_service_callback) |
| 1023 | + self.navigation_mode_service_callback, |
| 1024 | + callback_group=self.main_group) |
1023 | 1025 |
|
1024 | 1026 | self.switch_to_position_mode_service = self.create_service(Trigger,
|
1025 | 1027 | '/switch_to_position_mode',
|
1026 |
| - self.position_mode_service_callback) |
| 1028 | + self.position_mode_service_callback, |
| 1029 | + callback_group=self.main_group) |
1027 | 1030 |
|
1028 | 1031 | self.switch_to_trajectory_mode_service = self.create_service(Trigger,
|
1029 | 1032 | '/switch_to_trajectory_mode',
|
1030 |
| - self.trajectory_mode_service_callback) |
| 1033 | + self.trajectory_mode_service_callback, |
| 1034 | + callback_group=self.main_group) |
1031 | 1035 |
|
1032 | 1036 | self.switch_to_gamepad_mode_service = self.create_service(Trigger,
|
1033 | 1037 | '/switch_to_gamepad_mode',
|
1034 |
| - self.gamepad_mode_service_callback) |
| 1038 | + self.gamepad_mode_service_callback, |
| 1039 | + callback_group=self.main_group) |
1035 | 1040 |
|
1036 | 1041 | self.activate_streaming_position_service = self.create_service(Trigger,
|
1037 | 1042 | '/activate_streaming_position',
|
1038 |
| - self.activate_streaming_position_service_callback) |
| 1043 | + self.activate_streaming_position_service_callback, |
| 1044 | + callback_group=self.main_group) |
1039 | 1045 |
|
1040 | 1046 | self.deactivate_streaming_position_service = self.create_service(Trigger,
|
1041 | 1047 | '/deactivate_streaming_position',
|
1042 |
| - self.deactivate_streaming_position_service_callback) |
| 1048 | + self.deactivate_streaming_position_service_callback, |
| 1049 | + callback_group=self.main_group) |
1043 | 1050 |
|
1044 | 1051 | self.stop_the_robot_service = self.create_service(Trigger,
|
1045 | 1052 | '/stop_the_robot',
|
1046 |
| - self.stop_the_robot_callback) |
| 1053 | + self.stop_the_robot_callback, |
| 1054 | + callback_group=self.main_group) |
1047 | 1055 |
|
1048 | 1056 | self.home_the_robot_service = self.create_service(Trigger,
|
1049 | 1057 | '/home_the_robot',
|
1050 |
| - self.home_the_robot_callback) |
| 1058 | + self.home_the_robot_callback, |
| 1059 | + callback_group=self.main_group) |
1051 | 1060 |
|
1052 | 1061 | self.stow_the_robot_service = self.create_service(Trigger,
|
1053 | 1062 | '/stow_the_robot',
|
1054 |
| - self.stow_the_robot_callback) |
| 1063 | + self.stow_the_robot_callback, |
| 1064 | + callback_group=self.main_group) |
1055 | 1065 |
|
1056 | 1066 | self.runstop_service = self.create_service(SetBool,
|
1057 | 1067 | '/runstop',
|
1058 |
| - self.runstop_service_callback) |
| 1068 | + self.runstop_service_callback, |
| 1069 | + callback_group=self.main_group) |
1059 | 1070 |
|
1060 | 1071 | self.get_joint_states = self.create_service(Trigger,
|
1061 | 1072 | '/get_joint_states',
|
1062 |
| - self.get_joint_states_callback) |
| 1073 | + self.get_joint_states_callback, |
| 1074 | + callback_group=self.main_group) |
1063 | 1075 |
|
1064 | 1076 | self.self_collision_avoidance = self.create_service(SetBool,
|
1065 | 1077 | '/self_collision_avoidance',
|
1066 |
| - self.self_collision_avoidance_callback) |
| 1078 | + self.self_collision_avoidance_callback, |
| 1079 | + callback_group=self.main_group) |
1067 | 1080 |
|
1068 | 1081 | # start loop to command the mobile base velocity, publish
|
1069 | 1082 | # odometry, and publish joint states
|
1070 | 1083 | timer_period = 1.0 / self.joint_state_rate
|
1071 |
| - self.timer = self.create_timer(timer_period, self.command_mobile_base_velocity_and_publish_state) |
| 1084 | + self.timer = self.create_timer(timer_period, self.command_mobile_base_velocity_and_publish_state, callback_group=self.mutex_group) |
1072 | 1085 |
|
1073 | 1086 |
|
1074 | 1087 | def main():
|
|
0 commit comments