Skip to content

Commit 34b2d6a

Browse files
arjo129xiyuoh
authored andcommitted
fix: QoS mismatch in tests (#28)
* Fix QoS durability mismatches in integration tests Signed-off-by: Arjo Chakravarty <arjoc@intrinsic.ai> * CI: Run tests sequentially to avoid DDS interference Signed-off-by: Arjo Chakravarty <arjoc@intrinsic.ai> --------- Signed-off-by: Arjo Chakravarty <arjoc@intrinsic.ai>
1 parent 705e038 commit 34b2d6a

7 files changed

Lines changed: 71 additions & 49 deletions

File tree

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,6 @@ jobs:
3434
run: |
3535
source /opt/ros/jazzy/setup.bash
3636
source install/setup.bash
37-
colcon test --packages-select rmf_path_server_test rmf_reservation_tests --event-handlers console_direct+
37+
colcon test --executor sequential --packages-select rmf_path_server_test rmf_reservation_tests --event-handlers console_direct+
3838
colcon test-result --all
3939
shell: bash

path_server/rmf_path_server_test/test/test_path_server_follow.py

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
from nav_msgs.msg import Odometry
2323
import pytest
2424
import rclpy
25-
from rclpy.qos import DurabilityPolicy, HistoryPolicy, QoSProfile
25+
from rclpy.qos import DurabilityPolicy, HistoryPolicy, QoSProfile, ReliabilityPolicy
2626
from rmf_prototype_msgs.msg import (
2727
Destination,
2828
DestinationConstraints,
@@ -131,6 +131,13 @@ def test_follow_scenario(self):
131131
r2_positions = []
132132
trajectory = []
133133

134+
reliable_transient_qos = QoSProfile(
135+
depth=10,
136+
durability=DurabilityPolicy.TRANSIENT_LOCAL,
137+
history=HistoryPolicy.KEEP_LAST,
138+
reliability=ReliabilityPolicy.RELIABLE,
139+
)
140+
134141
def r1_odom_cb(msg):
135142
x = msg.pose.pose.position.x
136143
y = msg.pose.pose.position.y
@@ -167,26 +174,33 @@ def r2_plan_cb(msg):
167174
f'progress {wp.progress}, blockers: {blockers}'
168175
)
169176

170-
self.node.create_subscription(Odometry, 'robot_1/odom', r1_odom_cb, 10)
171-
self.node.create_subscription(Odometry, 'robot_2/odom', r2_odom_cb, 10)
172-
self.node.create_subscription(Plan, 'robot_1/plan', r1_plan_cb, 10)
173-
self.node.create_subscription(Plan, 'robot_2/plan', r2_plan_cb, 10)
177+
self.node.create_subscription(
178+
Odometry, 'robot_1/odom', r1_odom_cb,
179+
qos_profile=reliable_transient_qos
180+
)
181+
self.node.create_subscription(
182+
Odometry, 'robot_2/odom', r2_odom_cb,
183+
qos_profile=reliable_transient_qos
184+
)
185+
self.node.create_subscription(
186+
Plan, 'robot_1/plan', r1_plan_cb,
187+
qos_profile=reliable_transient_qos
188+
)
189+
self.node.create_subscription(
190+
Plan, 'robot_2/plan', r2_plan_cb,
191+
qos_profile=reliable_transient_qos
192+
)
174193

175194
# Publishers for destinations
176-
dest_qos = QoSProfile(
177-
depth=10,
178-
durability=DurabilityPolicy.TRANSIENT_LOCAL,
179-
history=HistoryPolicy.KEEP_LAST
180-
)
181195
r1_dest_pub = self.node.create_publisher(
182196
Destination,
183197
'robot_1/destination',
184-
qos_profile=dest_qos
198+
qos_profile=reliable_transient_qos
185199
)
186200
r2_dest_pub = self.node.create_publisher(
187201
Destination,
188202
'robot_2/destination',
189-
qos_profile=dest_qos
203+
qos_profile=reliable_transient_qos
190204
)
191205

192206
# Discovery publisher

reservation_system/rmf_reservation_tests/test/test_overlap.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import launch_testing
2121
import pytest
2222
import rclpy
23-
from rclpy.qos import DurabilityPolicy, HistoryPolicy, QoSProfile
23+
from rclpy.qos import DurabilityPolicy, HistoryPolicy, QoSProfile, ReliabilityPolicy
2424
from rmf_prototype_msgs.msg import (
2525
Destination,
2626
DestinationConstraints,
@@ -86,29 +86,31 @@ def test_overlapping_reservation(self):
8686
r1_received = []
8787
r2_errors = []
8888

89+
reliable_transient_qos = QoSProfile(
90+
depth=10,
91+
durability=DurabilityPolicy.TRANSIENT_LOCAL,
92+
history=HistoryPolicy.KEEP_LAST,
93+
reliability=ReliabilityPolicy.RELIABLE,
94+
)
95+
8996
self.node.create_subscription(
9097
Destination,
9198
f'{r1_name}/destination',
9299
lambda msg: r1_received.append(msg),
93-
10,
100+
qos_profile=reliable_transient_qos,
94101
)
95102
self.node.create_subscription(
96103
DestinationError,
97104
f'{r2_name}/destination/error',
98105
lambda msg: r2_errors.append(msg),
99-
10,
106+
qos_profile=reliable_transient_qos,
100107
)
101108

102-
goal_qos = QoSProfile(
103-
depth=10,
104-
durability=DurabilityPolicy.TRANSIENT_LOCAL,
105-
history=HistoryPolicy.KEEP_LAST,
106-
)
107109
pub1 = self.node.create_publisher(
108-
DestinationGoal, f'{r1_name}/destination/goal', qos_profile=goal_qos
110+
DestinationGoal, f'{r1_name}/destination/goal', qos_profile=reliable_transient_qos
109111
)
110112
pub2 = self.node.create_publisher(
111-
DestinationGoal, f'{r2_name}/destination/goal', qos_profile=goal_qos
113+
DestinationGoal, f'{r2_name}/destination/goal', qos_profile=reliable_transient_qos
112114
)
113115

114116
discovery_qos = QoSProfile(

reservation_system/rmf_reservation_tests/test/test_path_server.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
from nav_msgs.msg import Odometry
2222
import pytest
2323
import rclpy
24-
from rclpy.qos import DurabilityPolicy, HistoryPolicy, QoSProfile
24+
from rclpy.qos import DurabilityPolicy, HistoryPolicy, QoSProfile, ReliabilityPolicy
2525
from rmf_prototype_msgs.msg import (
2626
Destination,
2727
DestinationConstraints,
@@ -88,28 +88,30 @@ def test_plan_generation_and_publication(self):
8888
robot_name = 'robot_1'
8989
received_plans = []
9090

91+
reliable_transient_qos = QoSProfile(
92+
depth=10,
93+
durability=DurabilityPolicy.TRANSIENT_LOCAL,
94+
history=HistoryPolicy.KEEP_LAST,
95+
reliability=ReliabilityPolicy.RELIABLE,
96+
)
97+
9198
self.node.create_subscription(
9299
Plan,
93100
f'{robot_name}/plan',
94101
lambda msg: received_plans.append(msg),
95-
10
102+
qos_profile=reliable_transient_qos
96103
)
97104

98-
input_qos = QoSProfile(
99-
depth=10,
100-
durability=DurabilityPolicy.TRANSIENT_LOCAL,
101-
history=HistoryPolicy.KEEP_LAST,
102-
)
103105
dest_pub = self.node.create_publisher(
104106
Destination,
105107
f'{robot_name}/destination',
106-
qos_profile=input_qos
108+
qos_profile=reliable_transient_qos
107109
)
108110

109111
odom_pub = self.node.create_publisher(
110112
Odometry,
111113
f'{robot_name}/odom',
112-
qos_profile=input_qos
114+
qos_profile=reliable_transient_qos
113115
)
114116

115117
discovery_qos = QoSProfile(

reservation_system/rmf_reservation_tests/test/test_queue.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
import launch_testing
2525
import pytest
2626
import rclpy
27-
from rclpy.qos import DurabilityPolicy, HistoryPolicy, QoSProfile
27+
from rclpy.qos import DurabilityPolicy, HistoryPolicy, QoSProfile, ReliabilityPolicy
2828
from rmf_prototype_msgs.msg import (
2929
Destination,
3030
DestinationConstraints,
@@ -68,10 +68,11 @@ def setUpClass(cls):
6868
rclpy.init()
6969
cls.node = rclpy.create_node('test_queue_node')
7070

71-
cls.goal_qos = QoSProfile(
71+
cls.reliable_transient_qos = QoSProfile(
7272
depth=10,
7373
durability=DurabilityPolicy.TRANSIENT_LOCAL,
7474
history=HistoryPolicy.KEEP_LAST,
75+
reliability=ReliabilityPolicy.RELIABLE,
7576
)
7677
discovery_qos = QoSProfile(
7778
depth=1,
@@ -86,7 +87,7 @@ def setUpClass(cls):
8687
Destination,
8788
f'{name}/destination',
8889
lambda msg, n=name: cls.destinations[n].append(msg),
89-
10,
90+
qos_profile=cls.reliable_transient_qos,
9091
)
9192

9293
cls.discovery_pub = cls.node.create_publisher(
@@ -122,7 +123,7 @@ def setUp(self):
122123

123124
for name in ROBOT_NAMES:
124125
self.goal_pubs[name] = self.node.create_publisher(
125-
DestinationGoal, f'{name}/destination/goal', qos_profile=self.goal_qos
126+
DestinationGoal, f'{name}/destination/goal', qos_profile=self.reliable_transient_qos
126127
)
127128

128129
for buffer in self.destinations.values():

reservation_system/rmf_reservation_tests/test/test_reservation.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import launch_testing
2121
import pytest
2222
import rclpy
23-
from rclpy.qos import DurabilityPolicy, HistoryPolicy, QoSProfile
23+
from rclpy.qos import DurabilityPolicy, HistoryPolicy, QoSProfile, ReliabilityPolicy
2424
from rmf_prototype_msgs.msg import (
2525
Destination,
2626
DestinationConstraints,
@@ -81,22 +81,24 @@ def test_single_reservation(self):
8181
robot_name = 'robot_1'
8282
received_dest = []
8383

84+
reliable_transient_qos = QoSProfile(
85+
depth=10,
86+
durability=DurabilityPolicy.TRANSIENT_LOCAL,
87+
history=HistoryPolicy.KEEP_LAST,
88+
reliability=ReliabilityPolicy.RELIABLE,
89+
)
90+
8491
self.node.create_subscription(
8592
Destination,
8693
f'{robot_name}/destination',
8794
lambda msg: received_dest.append(msg),
88-
10
95+
qos_profile=reliable_transient_qos
8996
)
9097

91-
goal_qos = QoSProfile(
92-
depth=10,
93-
durability=DurabilityPolicy.TRANSIENT_LOCAL,
94-
history=HistoryPolicy.KEEP_LAST,
95-
)
9698
pub = self.node.create_publisher(
9799
DestinationGoal,
98100
f'{robot_name}/destination/goal',
99-
qos_profile=goal_qos
101+
qos_profile=reliable_transient_qos
100102
)
101103

102104
discovery_qos = QoSProfile(

reservation_system/rmf_reservation_tests/test/test_safe_sets.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
import launch_testing
2828
import pytest
2929
import rclpy
30-
from rclpy.qos import DurabilityPolicy, HistoryPolicy, QoSProfile
30+
from rclpy.qos import DurabilityPolicy, HistoryPolicy, QoSProfile, ReliabilityPolicy
3131
from rmf_prototype_msgs.msg import (
3232
Destination,
3333
DestinationConstraints,
@@ -77,10 +77,11 @@ def setUpClass(cls):
7777
rclpy.init()
7878
cls.node = rclpy.create_node('test_safe_sets_node')
7979

80-
goal_qos = QoSProfile(
80+
reliable_transient_qos = QoSProfile(
8181
depth=10,
8282
durability=DurabilityPolicy.TRANSIENT_LOCAL,
8383
history=HistoryPolicy.KEEP_LAST,
84+
reliability=ReliabilityPolicy.RELIABLE,
8485
)
8586
discovery_qos = QoSProfile(
8687
depth=1,
@@ -98,16 +99,16 @@ def setUpClass(cls):
9899
Destination,
99100
f'{name}/destination',
100101
lambda msg, n=name: cls.destinations[n].append(msg),
101-
10,
102+
qos_profile=reliable_transient_qos,
102103
)
103104
cls.node.create_subscription(
104105
DestinationError,
105106
f'{name}/destination/error',
106107
lambda msg, n=name: cls.errors[n].append(msg),
107-
10,
108+
qos_profile=reliable_transient_qos,
108109
)
109110
cls.goal_pubs[name] = cls.node.create_publisher(
110-
DestinationGoal, f'{name}/destination/goal', qos_profile=goal_qos
111+
DestinationGoal, f'{name}/destination/goal', qos_profile=reliable_transient_qos
111112
)
112113

113114
cls.discovery_pub = cls.node.create_publisher(

0 commit comments

Comments
 (0)