Skip to content

Commit 033781e

Browse files
committed
Feat: params to a dedicated yaml file and made change to make a unique torque service
1 parent 2b7bdc6 commit 033781e

File tree

5 files changed

+65
-37
lines changed

5 files changed

+65
-37
lines changed

CMakeLists.txt

+7-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ find_package(rosidl_default_generators REQUIRED)
1515
rosidl_generate_interfaces(${PROJECT_NAME}
1616
"srv/GetLX16AInfo.srv"
1717
"srv/SetLX16AParams.srv"
18-
"srv/SetLX16ATorqueLed.srv"
18+
"srv/SetLX16ATorque.srv"
1919
)
2020

2121
# Install Python modules
@@ -28,6 +28,12 @@ install(
2828
DESTINATION lib/${PROJECT_NAME}
2929
)
3030

31+
# Install YAML
32+
install(
33+
DIRECTORY params/
34+
DESTINATION share/${PROJECT_NAME}/params
35+
)
36+
3137
if(BUILD_TESTING)
3238
find_package(ament_lint_auto REQUIRED)
3339
# the following line skips the linter which checks for copyrights

params/lx16a_params.yaml

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
lx16a_controller:
2+
ros__parameters:
3+
default_angle_offset: 0
4+
default_angle_min: 0
5+
default_angle_max: 240
6+
default_voltage_min: 4500
7+
default_voltage_max: 12000
8+
default_temperature_limit: 85
9+
log_level: 0 #UNSET: 0 DEBUG: 10 INFO: 20 WARN: 30 ERROR: 40 FATAL: 50
10+
port: "/dev/ttyUSB0"
11+
scan_connected_servos: False
12+

src/lx16a_node.py

+45-35
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import rclpy
33
from rclpy.node import Node
44
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
66
from std_msgs.msg import Float32MultiArray, Int32MultiArray
77
from rclpy.logging import LoggingSeverity
88
import threading
@@ -13,14 +13,36 @@ class LX16AController(Node):
1313
def __init__(self):
1414
super().__init__('lx16a_controller')
1515

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+
1637
# Manage log verbosity
17-
self.get_logger().set_level(LoggingSeverity.UNSET)
38+
self.get_logger().set_level(self.get_parameter('log_level').value)
1839

1940
# Initialize the LX-16A bus
2041
try:
21-
LX16A.initialize("/dev/ttyUSB0")
42+
LX16A.initialize(self.get_parameter('port').value)
2243
self.servos = {}
23-
self.scan_connected_servos()
44+
if self.get_parameter('scan_connected_servos').value:
45+
self.scan_connected_servos()
2446
except Exception as e:
2547
self.get_logger().error(f"Error initializing communication: {e}")
2648
self.destroy_node()
@@ -29,7 +51,7 @@ def __init__(self):
2951
# Create services
3052
self.srv_get = self.create_service(GetLX16AInfo, '/lx16a_get_info', self.handle_get_info)
3153
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)
3355

3456
# Create subscriber for position control
3557
self.position_subscriber = self.create_subscription(
@@ -109,32 +131,26 @@ def handle_set_params(self, request, response):
109131
self.get_logger().error(f"Servo {servo_id} not available.")
110132
response.success = False
111133
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-
}
122134

123135
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'])
127143
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']
130146
)
131147
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'])
134150
)
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']))
136152
servo.set_led_error_triggers( request.led_error_temp, request.led_error_voltage, request.led_error_locked)
137-
153+
138154
self.get_logger().info(f"Servo {servo_id} parameters updated.")
139155
response.success = True
140156
except Exception as e:
@@ -143,8 +159,8 @@ def handle_set_params(self, request, response):
143159

144160
return response
145161

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."""
148164
servo_id = int(request.id)
149165
servo = self.get_servo(servo_id)
150166

@@ -159,10 +175,7 @@ def handle_set_torque_led(self, request, response):
159175
servo.enable_torque()
160176
else:
161177
servo.disable_torque()
162-
if request.led_enabled:
163-
servo.led_power_on()
164-
else:
165-
servo.led_power_off()
178+
166179

167180
self.get_logger().info(f"Servo {servo_id} parameters updated.")
168181
response.success = True
@@ -207,11 +220,9 @@ def handle_velocity_command(self, msg):
207220

208221
def scan_connected_servos(self):
209222
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):
213224
try:
214-
servo = LX16A(servo_id)
225+
LX16A(servo_id)
215226
connected_ids.append(servo_id)
216227
except Exception:
217228
continue
@@ -220,7 +231,6 @@ def scan_connected_servos(self):
220231
self.get_logger().info(f"\033[32;1mConnected servos: {connected_ids}\033[0m")
221232
else:
222233
self.get_logger().warn("\033[31mNo servos detected.\033[0m")
223-
# self.get_logger().info(f"Connected servo IDs: {connected_ids}")
224234
return connected_ids
225235

226236
def main(args=None):

srv/SetLX16AParams.srv

+1
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,6 @@ float32 temperature_limit
99
bool led_error_temp True
1010
bool led_error_voltage True
1111
bool led_error_locked True
12+
bool led_enabled True
1213
---
1314
bool success
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
int32 id
22
bool torque_enabled True
3-
bool led_enabled True
43
---
54
bool success

0 commit comments

Comments
 (0)