Skip to content

Commit 92322d9

Browse files
authored
Added support to load parameters from backup file (#101)
1 parent 81766e2 commit 92322d9

File tree

6 files changed

+108
-13
lines changed

6 files changed

+108
-13
lines changed

blue_bringup/launch/base.launch.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,14 @@ def generate_launch_description() -> LaunchDescription:
237237
LaunchConfiguration("manager_file"),
238238
]
239239
),
240+
"backup_params_file": PathJoinSubstitution(
241+
[
242+
FindPackageShare(description_package),
243+
"config",
244+
configuration_type,
245+
LaunchConfiguration("ardusub_params_file"),
246+
]
247+
),
240248
"use_sim_time": use_sim,
241249
}.items(),
242250
),

blue_description/config/bluerov2/ardusub.parm

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,3 +104,11 @@ EK3_SRC1_YAW 6 # External nav
104104

105105
# See https://github.com/clydemcqueen/bluerov2_ignition/issues/7
106106
SIM_BARO_RND 0.01
107+
108+
# Store thruster parameters as backups
109+
SERVO1_FUNCTION 33
110+
SERVO2_FUNCTION 34
111+
SERVO3_FUNCTION 35
112+
SERVO4_FUNCTION 36
113+
SERVO5_FUNCTION 37
114+
SERVO6_FUNCTION 38

blue_description/config/bluerov2_heavy/ardusub.parm

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,3 +82,13 @@ EK3_SRC1_YAW 6 # External nav
8282

8383
# See https://github.com/clydemcqueen/bluerov2_ignition/issues/7
8484
SIM_BARO_RND 0.01
85+
86+
# Store thruster parameters as backups
87+
SERVO1_FUNCTION 33
88+
SERVO2_FUNCTION 34
89+
SERVO3_FUNCTION 35
90+
SERVO4_FUNCTION 36
91+
SERVO5_FUNCTION 37
92+
SERVO6_FUNCTION 38
93+
SERVO7_FUNCTION 39
94+
SERVO8_FUNCTION 40

blue_description/config/bluerov2_heavy_reach/ardusub.parm

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,3 +82,13 @@ EK3_SRC1_YAW 6 # External nav
8282

8383
# See https://github.com/clydemcqueen/bluerov2_ignition/issues/7
8484
SIM_BARO_RND 0.01
85+
86+
# Store thruster parameters as backups
87+
SERVO1_FUNCTION 33
88+
SERVO2_FUNCTION 34
89+
SERVO3_FUNCTION 35
90+
SERVO4_FUNCTION 36
91+
SERVO5_FUNCTION 37
92+
SERVO6_FUNCTION 38
93+
SERVO7_FUNCTION 39
94+
SERVO8_FUNCTION 40

blue_manager/blue_manager/manager.py

Lines changed: 62 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
from geographic_msgs.msg import GeoPoint, GeoPointStamped
2525
from mavros_msgs.msg import OverrideRCIn, ParamEvent
2626
from mavros_msgs.srv import CommandHome, MessageInterval
27-
from rcl_interfaces.msg import Parameter
27+
from rcl_interfaces.msg import Parameter, ParameterValue
2828
from rcl_interfaces.srv import SetParameters
2929
from rclpy.callback_groups import ReentrantCallbackGroup
3030
from rclpy.executors import MultiThreadedExecutor
@@ -43,6 +43,7 @@ def __init__(self) -> None:
4343
super().__init__("blue_manager")
4444

4545
self.declare_parameter("num_thrusters", 8)
46+
self.declare_parameter("backup_params_file", "")
4647
self.declare_parameters(
4748
namespace="message_intervals",
4849
parameters=[ # type: ignore
@@ -95,6 +96,27 @@ def __init__(self) -> None:
9596
f"SERVO{i}_FUNCTION": None for i in range(1, self.num_thrusters + 1)
9697
}
9798

99+
# Try to load the backup parameters from a file
100+
backup_filepath = (
101+
self.get_parameter("backup_params_file").get_parameter_value().string_value
102+
)
103+
if not self.backup_thruster_params_from_file(backup_filepath):
104+
self.get_logger().info(
105+
"Failed to load all thruster parameters from the provided backup file."
106+
" Attempting to load parameters from MAVROS."
107+
)
108+
self.param_event_sub = self.create_subscription(
109+
ParamEvent,
110+
"/mavros/param/event",
111+
self.backup_thruster_params_cb,
112+
qos_profile_parameter_events,
113+
)
114+
else:
115+
self.get_logger().info(
116+
"Successfully backed up the thruster parameters from the parameters"
117+
" file."
118+
)
119+
98120
# Publishers
99121
self.override_rc_in_pub = self.create_publisher(
100122
OverrideRCIn, "/mavros/rc/override", qos_profile_default
@@ -105,14 +127,6 @@ def __init__(self) -> None:
105127
qos_profile_default,
106128
)
107129

108-
# Subscribers
109-
self.param_event_sub = self.create_subscription(
110-
ParamEvent,
111-
"/mavros/param/event",
112-
self.backup_thruster_params_cb,
113-
qos_profile_parameter_events,
114-
)
115-
116130
# Services
117131
self.set_pwm_passthrough_srv = self.create_service(
118132
SetBool,
@@ -246,14 +260,51 @@ def set_home_pos(lat: float, lon: float, alt: float, yaw: float) -> None:
246260
)
247261

248262
@property
249-
def params_successfully_backed_up(self) -> bool:
263+
def backup_params_saved(self) -> bool:
250264
"""Whether or not the thruster parameters are backed up.
251265
252266
Returns:
253267
Whether or not the parameters are backed up.
254268
"""
255269
return None not in self.thruster_params_backup.values()
256270

271+
def backup_thruster_params_from_file(self, backup_filepath: str) -> bool:
272+
"""Backup thruster parameters from a parameters file.
273+
274+
Args:
275+
backup_filepath: The full path to the backup file to load.
276+
277+
Returns:
278+
Whether or not the parameters were successfully backed up from the file.
279+
"""
280+
if not backup_filepath:
281+
return False
282+
283+
with open(backup_filepath, "r") as ardusub_params:
284+
params = ardusub_params.readlines()
285+
286+
for line in params:
287+
line = line.rstrip()
288+
split = line.split(" ")
289+
290+
try:
291+
param_id = split[0]
292+
except IndexError:
293+
continue
294+
295+
try:
296+
param_value = int(split[1])
297+
except (ValueError, IndexError):
298+
continue
299+
300+
if param_id in self.thruster_params_backup.keys():
301+
self.thruster_params_backup[param_id] = Parameter(
302+
name=param_id,
303+
value=ParameterValue(type=2, integer_value=param_value),
304+
)
305+
306+
return self.backup_params_saved
307+
257308
def backup_thruster_params_cb(self, event: ParamEvent) -> None:
258309
"""Backup the default thruster parameter values.
259310
@@ -273,7 +324,7 @@ def backup_thruster_params_cb(self, event: ParamEvent) -> None:
273324
name=event.param_id, value=event.value
274325
)
275326

276-
if self.params_successfully_backed_up:
327+
if self.backup_params_saved:
277328
self.get_logger().info(
278329
"Successfully backed up the thruster parameters."
279330
)

blue_manager/launch/manager.launch.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,12 @@ def generate_launch_description() -> LaunchDescription:
3939
DeclareLaunchArgument(
4040
"use_sim_time",
4141
default_value="false",
42-
description=("Use the simulated Gazebo clock."),
42+
description="Use the simulated Gazebo clock.",
43+
),
44+
DeclareLaunchArgument(
45+
"backup_params_file",
46+
default_value="",
47+
description="A configuration file with the ArduSub thruster parameters.",
4348
),
4449
]
4550

@@ -51,7 +56,10 @@ def generate_launch_description() -> LaunchDescription:
5156
output="both",
5257
parameters=[
5358
LaunchConfiguration("config_filepath"),
54-
{"use_sim_time": LaunchConfiguration("use_sim_time")},
59+
{
60+
"backup_params_file": LaunchConfiguration("backup_params_file"),
61+
"use_sim_time": LaunchConfiguration("use_sim_time"),
62+
},
5563
],
5664
),
5765
]

0 commit comments

Comments
 (0)