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 GetLX16AInfo , SetLX16AParams , SetLX16ATorqueLed
5
+ from ros2_lx16a_driver .srv import GetLX16AInfo , SetLX16AParams , SetLX16ATorque
6
6
from std_msgs .msg import Float32MultiArray , Int32MultiArray
7
7
from rclpy .logging import LoggingSeverity
8
8
import threading
@@ -13,14 +13,36 @@ class LX16AController(Node):
13
13
def __init__ (self ):
14
14
super ().__init__ ('lx16a_controller' )
15
15
16
+ # Définir les paramètres avec des valeurs par défaut
17
+ self .declare_parameter ('default_angle_offset' , 0 )
18
+ self .declare_parameter ('default_angle_min' , 0 )
19
+ self .declare_parameter ('default_angle_max' , 240 )
20
+ self .declare_parameter ('default_voltage_min' , 4500 )
21
+ self .declare_parameter ('default_voltage_max' , 12000 )
22
+ self .declare_parameter ('default_temperature_limit' , 85 )
23
+ self .declare_parameter ('log_level' , 0 )
24
+ self .declare_parameter ('port' , '/dev/ttyUSB0' )
25
+ self .declare_parameter ('scan_connected_servos' , False )
26
+
27
+ # Charger les paramètres
28
+ self .default_values = {
29
+ 'angle_offset' : self .get_parameter ('default_angle_offset' ).value ,
30
+ 'angle_min' : self .get_parameter ('default_angle_min' ).value ,
31
+ 'angle_max' : self .get_parameter ('default_angle_max' ).value ,
32
+ 'voltage_min' : self .get_parameter ('default_voltage_min' ).value ,
33
+ 'voltage_max' : self .get_parameter ('default_voltage_max' ).value ,
34
+ 'temperature_limit' : self .get_parameter ('default_temperature_limit' ).value ,
35
+ }
36
+
16
37
# Manage log verbosity
17
- self .get_logger ().set_level (LoggingSeverity . UNSET )
38
+ self .get_logger ().set_level (self . get_parameter ( 'log_level' ). value )
18
39
19
40
# Initialize the LX-16A bus
20
41
try :
21
- LX16A .initialize ("/dev/ttyUSB0" )
42
+ LX16A .initialize (self . get_parameter ( 'port' ). value )
22
43
self .servos = {}
23
- self .scan_connected_servos ()
44
+ if self .get_parameter ('scan_connected_servos' ).value :
45
+ self .scan_connected_servos ()
24
46
except Exception as e :
25
47
self .get_logger ().error (f"Error initializing communication: { e } " )
26
48
self .destroy_node ()
@@ -29,7 +51,7 @@ def __init__(self):
29
51
# Create services
30
52
self .srv_get = self .create_service (GetLX16AInfo , '/lx16a_get_info' , self .handle_get_info )
31
53
self .srv_set_params = self .create_service (SetLX16AParams , '/lx16a_set_params' , self .handle_set_params )
32
- self .srv_set_torque_led = self .create_service (SetLX16ATorqueLed , '/lx16a_set_torque_led ' , self .handle_set_torque_led )
54
+ self .srv_set_torque = self .create_service (SetLX16ATorque , '/lx16a_set_torque ' , self .handle_set_torque )
33
55
34
56
# Create subscriber for position control
35
57
self .position_subscriber = self .create_subscription (
@@ -109,32 +131,26 @@ def handle_set_params(self, request, response):
109
131
self .get_logger ().error (f"Servo { servo_id } not available." )
110
132
response .success = False
111
133
return response
112
-
113
- default_values = {
114
- 'new_id' : servo_id ,
115
- 'angle_offset' : 0 ,
116
- 'angle_min' : 0 ,
117
- 'angle_max' : 240 ,
118
- 'voltage_min' : 4500 ,
119
- 'voltage_max' : 12000 ,
120
- 'temperature_limit' : 85 ,
121
- }
122
134
123
135
try :
124
- # Appliquez les paramètres reçus ou utilisez les valeurs par défaut
125
- servo .set_id (request .new_id if 0 <= request .new_id <= 253 else default_values ['new_id' ])
126
- servo .set_angle_offset (request .angle_offset if - 30 <= request .angle_offset <= 30 else default_values ['angle_offset' ])
136
+ # Apply the parameters received or use the default values
137
+ if request .led_enabled :
138
+ servo .led_power_on ()
139
+ else :
140
+ servo .led_power_off ()
141
+ servo .set_id (request .new_id if 0 <= request .new_id <= 253 else servo_id )
142
+ servo .set_angle_offset (request .angle_offset if - 30 <= request .angle_offset <= 30 else self .default_values ['angle_offset' ])
127
143
servo .set_angle_limits (
128
- request .angle_min if 0 <= request .angle_min <= 240 else default_values ['angle_min' ],
129
- request .angle_max if 0 <= request .angle_max <= 240 else default_values ['angle_max' ]
144
+ request .angle_min if 0 <= request .angle_min <= 240 else self . default_values ['angle_min' ],
145
+ request .angle_max if 0 <= request .angle_max <= 240 else self . default_values ['angle_max' ]
130
146
)
131
147
servo .set_vin_limits (
132
- int (request .voltage_min ) if 4500 <= request .voltage_min <= 12000 else int (default_values ['voltage_min' ]),
133
- int (request .voltage_max ) if 4500 <= request .voltage_min <= 12000 else int (default_values ['voltage_max' ])
148
+ int (request .voltage_min ) if 4500 <= request .voltage_min <= 12000 else int (self . default_values ['voltage_min' ]),
149
+ int (request .voltage_max ) if 4500 <= request .voltage_min <= 12000 else int (self . default_values ['voltage_max' ])
134
150
)
135
- servo .set_temp_limit (int (request .temperature_limit ) if 50 <= request .temperature_limit <= 100 else int (default_values ['temperature_limit' ]))
151
+ servo .set_temp_limit (int (request .temperature_limit ) if 50 <= request .temperature_limit <= 100 else int (self . default_values ['temperature_limit' ]))
136
152
servo .set_led_error_triggers ( request .led_error_temp , request .led_error_voltage , request .led_error_locked )
137
-
153
+
138
154
self .get_logger ().info (f"Servo { servo_id } parameters updated." )
139
155
response .success = True
140
156
except Exception as e :
@@ -143,8 +159,8 @@ def handle_set_params(self, request, response):
143
159
144
160
return response
145
161
146
- def handle_set_torque_led (self , request , response ):
147
- """Service to set torque and control the LED of a servo."""
162
+ def handle_set_torque (self , request , response ):
163
+ """Service to set torque of a servo."""
148
164
servo_id = int (request .id )
149
165
servo = self .get_servo (servo_id )
150
166
@@ -159,10 +175,7 @@ def handle_set_torque_led(self, request, response):
159
175
servo .enable_torque ()
160
176
else :
161
177
servo .disable_torque ()
162
- if request .led_enabled :
163
- servo .led_power_on ()
164
- else :
165
- servo .led_power_off ()
178
+
166
179
167
180
self .get_logger ().info (f"Servo { servo_id } parameters updated." )
168
181
response .success = True
@@ -207,11 +220,9 @@ def handle_velocity_command(self, msg):
207
220
208
221
def scan_connected_servos (self ):
209
222
connected_ids = []
210
- total_servos = 254
211
- bar_length = 40
212
- for i ,servo_id in enumerate (range (0 , total_servos )):
223
+ for servo_id in range (254 ):
213
224
try :
214
- servo = LX16A (servo_id )
225
+ LX16A (servo_id )
215
226
connected_ids .append (servo_id )
216
227
except Exception :
217
228
continue
@@ -220,7 +231,6 @@ def scan_connected_servos(self):
220
231
self .get_logger ().info (f"\033 [32;1mConnected servos: { connected_ids } \033 [0m" )
221
232
else :
222
233
self .get_logger ().warn ("\033 [31mNo servos detected.\033 [0m" )
223
- # self.get_logger().info(f"Connected servo IDs: {connected_ids}")
224
234
return connected_ids
225
235
226
236
def main (args = None ):
0 commit comments