2
2
import rclpy
3
3
from rclpy .node import Node
4
4
from pylx16a .lx16a import LX16A
5
- from ros2_lx16a_driver .srv import GetServoInfo
5
+ from ros2_lx16a_driver .srv import GetLX16AInfo , SetLX16AParams , SetLX16ATorqueLed
6
6
from std_msgs .msg import Float32MultiArray # Message utilisé pour la commande de position
7
7
8
8
class LX16AController (Node ):
@@ -18,8 +18,10 @@ def __init__(self):
18
18
self .destroy_node ()
19
19
return
20
20
21
- # Création du service GetServoInfo
22
- self .srv = self .create_service (GetServoInfo , '/get_servo_info' , self .handle_get_servo_info )
21
+ # Création des services
22
+ self .srv_get = self .create_service (GetLX16AInfo , '/lx16a_get_info' , self .handle_get_info )
23
+ self .srv_set_params = self .create_service (SetLX16AParams , '/lx16a_set_params' , self .handle_set_params )
24
+ self .srv_set_torque_led = self .create_service (SetLX16ATorqueLed , '/lx16a_set_torque_led' , self .handle_set_torque_led )
23
25
24
26
# Création du subscriber pour la commande de position
25
27
self .position_subscriber = self .create_subscription (
@@ -42,7 +44,7 @@ def get_servo(self, servo_id):
42
44
return None
43
45
return self .servos [servo_id ]
44
46
45
- def handle_get_servo_info (self , request , response ):
47
+ def handle_get_info (self , request , response ):
46
48
"""Service pour obtenir les informations détaillées d'un servo."""
47
49
servo_id = int (request .id ) # ID du servo demandé
48
50
servo = self .get_servo (servo_id )
@@ -82,6 +84,82 @@ def handle_get_servo_info(self, request, response):
82
84
83
85
return response
84
86
87
+ def handle_set_params (self , request , response ):
88
+ """Service pour définir les paramètres d'un servo."""
89
+ servo_id = int (request .id )
90
+ servo = self .get_servo (servo_id )
91
+
92
+ if servo is None :
93
+ self .get_logger ().error (f"Servo { servo_id } non disponible." )
94
+ response .success = False
95
+ return response
96
+
97
+ # default_values = {
98
+ # 'new_id': 0,
99
+ # 'angle_offset': 0,
100
+ # 'angle_min': 0,
101
+ # 'angle_max': 240,
102
+ # 'voltage_min': 4500.0,
103
+ # 'voltage_max': 12000.0,
104
+ # 'temperature_limit': 85.0,
105
+ # 'motor_mode': False,
106
+ # 'motor_speed': 0.0,
107
+ # 'torque_enabled': True,
108
+ # 'led_enabled': True,
109
+ # 'led_flash_condition': 1
110
+ # }
111
+
112
+ try :
113
+ # Appliquer les paramètres reçus
114
+ servo .set_id (request .new_id )
115
+ servo .set_angle_offset (request .angle_offset )
116
+ servo .set_angle_limits (request .angle_min , request .angle_max )
117
+ servo .set_vin_limits (int (request .voltage_min ), int (request .voltage_max ))
118
+ servo .set_temp_limit (int (request .temperature_limit ))
119
+ # print(request.motor_mode)
120
+ # if request.motor_mode:
121
+ # servo.motor_mode(1000)
122
+ # else:
123
+ # servo.servo_mode()
124
+ servo .set_led_error_triggers (request .led_error_temp ,request .led_error_voltage ,request .led_error_locked )
125
+
126
+ self .get_logger ().info (f"Paramètres du servo { servo_id } mis à jour." )
127
+ response .success = True
128
+ except Exception as e :
129
+ self .get_logger ().error (f"Erreur lors de la mise à jour des paramètres du servo { servo_id } : { e } " )
130
+ response .success = False
131
+
132
+ return response
133
+
134
+ def handle_set_torque_led (self , request , response ):
135
+ """Service pour définir le torque et controller la led d'un servo."""
136
+ servo_id = int (request .id )
137
+ servo = self .get_servo (servo_id )
138
+
139
+ if servo is None :
140
+ self .get_logger ().error (f"Servo { servo_id } non disponible." )
141
+ response .success = False
142
+ return response
143
+
144
+ try :
145
+ # Appliquer les paramètres reçus
146
+ if request .torque_enabled :
147
+ servo .enable_torque ()
148
+ else :
149
+ servo .disable_torque ()
150
+ if request .led_enabled :
151
+ servo .led_power_on ()
152
+ else :
153
+ servo .led_power_off ()
154
+
155
+ self .get_logger ().info (f"Paramètres du servo { servo_id } mis à jour." )
156
+ response .success = True
157
+ except Exception as e :
158
+ self .get_logger ().error (f"Erreur lors de la mise à jour des paramètres du servo { servo_id } : { e } " )
159
+ response .success = False
160
+
161
+ return response
162
+
85
163
def handle_position_command (self , msg ):
86
164
"""Callback pour gérer la commande de position des servos."""
87
165
if len (msg .data ) == 0 :
@@ -90,7 +168,7 @@ def handle_position_command(self, msg):
90
168
91
169
# Appliquer la commande de position à chaque servo
92
170
for i , position in enumerate (msg .data ):
93
- servo = self .get_servo (i + 1 ) # Récupère le servo correspondant à l'index (1 basé )
171
+ servo = self .get_servo (i )
94
172
if servo is not None :
95
173
try :
96
174
servo .move (position ) # Méthode pour déplacer le servo à la position donnée
@@ -113,3 +191,4 @@ def main(args=None):
113
191
if __name__ == '__main__' :
114
192
main ()
115
193
194
+
0 commit comments