@@ -93,53 +93,42 @@ void LoadBehaviorTrees(BT::BehaviorTreeFactory& factory,
93
93
}
94
94
}
95
95
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)
98
98
{
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
102
101
{
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) )
105
104
{
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 ;
133
119
}
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 ());
134
126
}
135
127
}
136
128
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)
139
131
{
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
-
143
132
BT::RosNodeParams ros_params;
144
133
ros_params.nh = node;
145
134
ros_params.server_timeout = std::chrono::milliseconds (params.ros_plugins_timeout );
@@ -153,9 +142,21 @@ void RegisterBehaviorTrees(bt_server::Params& params, BT::BehaviorTreeFactory& f
153
142
{
154
143
continue ;
155
144
}
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
+ }
157
154
}
155
+ }
158
156
157
+ void RegisterBehaviorTrees (bt_server::Params& params, BT::BehaviorTreeFactory& factory,
158
+ rclcpp::Node::SharedPtr node)
159
+ {
159
160
for (const auto & tree_dir : params.behavior_trees )
160
161
{
161
162
const auto tree_directory = GetDirectoryPath (tree_dir);
0 commit comments