@@ -152,6 +152,14 @@ struct ControllerPeerInfo
152
152
continue ; // skip this predecessor, as it is already in a group as individual
153
153
}
154
154
155
+ if (
156
+ std::find (
157
+ current_combination.begin (), current_combination.end (), predecessors[i]->name ) !=
158
+ current_combination.end ())
159
+ {
160
+ continue ; // skip this predecessor, as it is already in the current combination
161
+ }
162
+
155
163
current_combination.push_back (predecessors[i]->name );
156
164
generate_combinations (i + 1 );
157
165
current_combination.pop_back ();
@@ -160,7 +168,8 @@ struct ControllerPeerInfo
160
168
161
169
RCLCPP_INFO (
162
170
rclcpp::get_logger (" controller_manager" ),
163
- " Generating combinations of predecessors for controller: %s" , name.c_str ());
171
+ " Generating combinations of predecessors for controller: %s (%s)" ,
172
+ predecessor->name .c_str (), name.c_str ());
164
173
generate_combinations (0 );
165
174
// Add the combinations to the mutually exclusive predecessor groups
166
175
for (const auto & combination : combinations)
@@ -275,6 +284,13 @@ struct ControllerPeerInfo
275
284
continue ; // skip this successor, as it is already in a group as individual
276
285
}
277
286
287
+ if (
288
+ std::find (
289
+ current_combination.begin (), current_combination.end (), successors[i]->name ) !=
290
+ current_combination.end ())
291
+ {
292
+ continue ; // skip this successor, as it is already in the current combination
293
+ }
278
294
current_combination.push_back (successors[i]->name );
279
295
generate_combinations (i + 1 );
280
296
current_combination.pop_back ();
@@ -299,6 +315,10 @@ struct ControllerPeerInfo
299
315
mutually_exclusive_successor_groups.push_back (group);
300
316
}
301
317
}
318
+ RCLCPP_INFO_STREAM (
319
+ rclcpp::get_logger (" controller_manager" ),
320
+ " Mutually exclusive successor groups for controller: "
321
+ << name << " are: " << mutually_exclusive_successor_groups.size ());
302
322
}
303
323
}
304
324
@@ -554,8 +574,25 @@ class ControllerChainDependencyGraph
554
574
{
555
575
controller_graph_[successor.name ] = successor;
556
576
}
557
- controller_graph_[predecessor.name ].successors .push_back (&controller_graph_[successor.name ]);
558
- controller_graph_[successor.name ].predecessors .push_back (&controller_graph_[predecessor.name ]);
577
+ if (
578
+ std::find_if (
579
+ controller_graph_[predecessor.name ].successors .begin (),
580
+ controller_graph_[predecessor.name ].successors .end (),
581
+ [&successor](const ControllerPeerInfo * s) { return s->name == successor.name ; }) ==
582
+ controller_graph_[predecessor.name ].successors .end ())
583
+ {
584
+ controller_graph_[predecessor.name ].successors .push_back (&controller_graph_[successor.name ]);
585
+ }
586
+ if (
587
+ std::find_if (
588
+ controller_graph_[successor.name ].predecessors .begin (),
589
+ controller_graph_[successor.name ].predecessors .end (),
590
+ [&predecessor](const ControllerPeerInfo * p) { return p->name == predecessor.name ; }) ==
591
+ controller_graph_[successor.name ].predecessors .end ())
592
+ {
593
+ controller_graph_[successor.name ].predecessors .push_back (
594
+ &controller_graph_[predecessor.name ]);
595
+ }
559
596
}
560
597
561
598
std::vector<std::string> get_dependencies_to_activate (const std::string & controller_name)
0 commit comments