Skip to content

Commit 5bd9a70

Browse files
committed
add --atomic option for ros2 param set
Signed-off-by: Brian Chen <[email protected]>
1 parent b514fd5 commit 5bd9a70

File tree

2 files changed

+26
-6
lines changed

2 files changed

+26
-6
lines changed

ros2param/ros2param/api/__init__.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,18 @@ def call_set_parameters(*, node, node_name, parameters):
9999
return response
100100

101101

102+
def call_set_parameters_atomically(*, node, node_name, parameters):
103+
client = AsyncParameterClient(node, node_name)
104+
client.wait_for_services(timeout_sec=5.0)
105+
future = client.set_parameters_atomically(parameters)
106+
rclpy.spin_until_future_complete(node, future)
107+
response = future.result()
108+
if response is None:
109+
raise RuntimeError('Exception while calling service of node '
110+
f'{node_name}: {future.exception()}')
111+
return response
112+
113+
102114
def call_list_parameters(*, node, node_name, prefixes=None):
103115
client = AsyncParameterClient(node, node_name)
104116
client.wait_for_services(timeout_sec=5.0)

ros2param/ros2param/verb/set.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222
from ros2node.api import get_absolute_node_name
2323
from ros2node.api import get_node_names
2424
from ros2node.api import NodeNameCompleter
25-
2625
from ros2param.api import call_set_parameters
26+
from ros2param.api import call_set_parameters_atomically
2727
from ros2param.api import ParameterNameCompleter
2828
from ros2param.verb import VerbExtension
2929

@@ -40,6 +40,10 @@ def add_arguments(self, parser, cli_name): # noqa: D102
4040
parser.add_argument(
4141
'--include-hidden-nodes', action='store_true',
4242
help='Consider hidden nodes as well')
43+
parser.add_argument(
44+
'--atomic', action='store_true',
45+
help='Set parameters atomically'
46+
)
4347
arg = parser.add_argument(
4448
'parameter_name', help='Name of the parameter')
4549
arg.completer = ParameterNameCompleter()
@@ -60,12 +64,16 @@ def main(self, *, args): # noqa: D102
6064
Parameter.name = args.parameter_name
6165
parameter.value = get_parameter_value(string_value=args.value)
6266

63-
response = call_set_parameters(
64-
node=node, node_name=args.node_name, parameters=[parameter])
67+
if args.atomic:
68+
response = call_set_parameters_atomically(
69+
node=node, node_name=args.node_name, parameters=[parameter])
70+
result = response.result
71+
else:
72+
response = call_set_parameters(
73+
node=node, node_name=args.node_name, parameters=[parameter])
74+
assert len(response.results) == 1
75+
result = response.results[0]
6576

66-
# output response
67-
assert len(response.results) == 1
68-
result = response.results[0]
6977
if result.successful:
7078
msg = 'Set parameter successful'
7179
if result.reason:

0 commit comments

Comments
 (0)