@@ -93,53 +93,42 @@ void LoadBehaviorTrees(BT::BehaviorTreeFactory& factory,
9393 }
9494}
9595
96- void LoadRosPlugins (BT::BehaviorTreeFactory& factory, const std::string& directory_path ,
97- BT::RosNodeParams params)
96+ void LoadPlugin (BT::BehaviorTreeFactory& factory, const std::filesystem::path& file_path ,
97+ BT::RosNodeParams params)
9898{
99- using std::filesystem::directory_iterator;
100-
101- for (const auto & entry : directory_iterator (directory_path))
99+ const auto filename = file_path.filename ();
100+ try
102101 {
103- const auto filename = entry. path (). filename ( );
104- if (entry. path (). extension () == " .so " )
102+ BT::SharedLibrary loader (file_path. string () );
103+ if (loader. hasSymbol (BT::PLUGIN_SYMBOL) )
105104 {
106- try
107- {
108- BT::SharedLibrary loader (entry.path ().string ());
109- if (loader.hasSymbol (BT::PLUGIN_SYMBOL))
110- {
111- typedef void (*Func)(BehaviorTreeFactory&);
112- auto func = (Func)loader.getSymbol (BT::PLUGIN_SYMBOL);
113- func (factory);
114- }
115- else if (loader.hasSymbol (BT::ROS_PLUGIN_SYMBOL))
116- {
117- typedef void (*Func)(BT::BehaviorTreeFactory&, const BT::RosNodeParams&);
118- auto func = (Func)loader.getSymbol (BT::ROS_PLUGIN_SYMBOL);
119- func (factory, params);
120- }
121- else
122- {
123- RCLCPP_ERROR (kLogger , " Failed to load Plugin from file: %s." , filename.c_str ());
124- continue ;
125- }
126- RCLCPP_INFO (kLogger , " Loaded ROS Plugin: %s" , filename.c_str ());
127- }
128- catch (const std::exception& e)
129- {
130- RCLCPP_ERROR (kLogger , " Failed to load ROS Plugin: %s \n %s" , filename.c_str (),
131- e.what ());
132- }
105+ typedef void (*Func)(BehaviorTreeFactory&);
106+ auto func = (Func)loader.getSymbol (BT::PLUGIN_SYMBOL);
107+ func (factory);
108+ }
109+ else if (loader.hasSymbol (BT::ROS_PLUGIN_SYMBOL))
110+ {
111+ typedef void (*Func)(BT::BehaviorTreeFactory&, const BT::RosNodeParams&);
112+ auto func = (Func)loader.getSymbol (BT::ROS_PLUGIN_SYMBOL);
113+ func (factory, params);
114+ }
115+ else
116+ {
117+ RCLCPP_ERROR (kLogger , " Failed to load Plugin from file: %s." , filename.c_str ());
118+ return ;
133119 }
120+ RCLCPP_INFO (kLogger , " Loaded ROS Plugin: %s" , filename.c_str ());
121+ }
122+ catch (const std::exception& ex)
123+ {
124+ RCLCPP_ERROR (kLogger , " Failed to load ROS Plugin: %s \n %s" , filename.c_str (),
125+ ex.what ());
134126 }
135127}
136128
137- void RegisterBehaviorTrees (bt_server::Params& params, BT::BehaviorTreeFactory& factory,
138- rclcpp::Node::SharedPtr node)
129+ void RegisterPlugins (bt_server::Params& params, BT::BehaviorTreeFactory& factory,
130+ rclcpp::Node::SharedPtr node)
139131{
140- // clear the factory and load/reload it with the Behaviors and Trees specified by the user in their [bt_action_server] config yaml
141- factory.clearRegisteredBehaviorTrees ();
142-
143132 BT::RosNodeParams ros_params;
144133 ros_params.nh = node;
145134 ros_params.server_timeout = std::chrono::milliseconds (params.ros_plugins_timeout );
@@ -153,9 +142,21 @@ void RegisterBehaviorTrees(bt_server::Params& params, BT::BehaviorTreeFactory& f
153142 {
154143 continue ;
155144 }
156- LoadRosPlugins (factory, plugin_directory, ros_params);
145+ using std::filesystem::directory_iterator;
146+
147+ for (const auto & entry : directory_iterator (plugin_directory))
148+ {
149+ if (entry.path ().extension () == " .so" )
150+ {
151+ LoadPlugin (factory, entry.path (), ros_params);
152+ }
153+ }
157154 }
155+ }
158156
157+ void RegisterBehaviorTrees (bt_server::Params& params, BT::BehaviorTreeFactory& factory,
158+ rclcpp::Node::SharedPtr node)
159+ {
159160 for (const auto & tree_dir : params.behavior_trees )
160161 {
161162 const auto tree_directory = GetDirectoryPath (tree_dir);
0 commit comments