3
3
from rclpy .node import Node
4
4
from pylx16a .lx16a import LX16A
5
5
from ros2_lx16a_driver .srv import GetServoInfo
6
+ from std_msgs .msg import Float32MultiArray # Message utilisé pour la commande de position
6
7
7
8
class LX16AController (Node ):
8
9
def __init__ (self ):
@@ -20,6 +21,14 @@ def __init__(self):
20
21
# Création du service GetServoInfo
21
22
self .srv = self .create_service (GetServoInfo , '/get_servo_info' , self .handle_get_servo_info )
22
23
24
+ # Création du subscriber pour la commande de position
25
+ self .position_subscriber = self .create_subscription (
26
+ Float32MultiArray , # Type de message
27
+ '/servo_positions' , # Nom du topic
28
+ self .handle_position_command , # Callback
29
+ 10 # Taille de la file d'attente
30
+ )
31
+
23
32
self .get_logger ().info ('Nœud LX-16A prêt.' )
24
33
25
34
def get_servo (self , servo_id ):
@@ -73,6 +82,21 @@ def handle_get_servo_info(self, request, response):
73
82
74
83
return response
75
84
85
+ def handle_position_command (self , msg ):
86
+ """Callback pour gérer la commande de position des servos."""
87
+ if len (msg .data ) == 0 :
88
+ self .get_logger ().warn ("Aucune commande de position reçue." )
89
+ return
90
+
91
+ # Appliquer la commande de position à chaque servo
92
+ for i , position in enumerate (msg .data ):
93
+ servo = self .get_servo (i + 1 ) # Récupère le servo correspondant à l'index (1 basé)
94
+ if servo is not None :
95
+ try :
96
+ servo .move (position ) # Méthode pour déplacer le servo à la position donnée
97
+ self .get_logger ().info (f"Servo { i + 1 } déplacé à la position { position } ." )
98
+ except Exception as e :
99
+ self .get_logger ().error (f"Erreur lors du déplacement du servo { i + 1 } : { e } " )
76
100
77
101
def main (args = None ):
78
102
rclpy .init (args = args )
@@ -88,3 +112,4 @@ def main(args=None):
88
112
89
113
if __name__ == '__main__' :
90
114
main ()
115
+
0 commit comments