3939#include < tesseract_process_managers/task_generators/seed_min_length_task_generator.h>
4040#include < tesseract_process_managers/task_generators/discrete_contact_check_task_generator.h>
4141#include < tesseract_process_managers/task_generators/iterative_spline_parameterization_task_generator.h>
42+ #include < tesseract_process_managers/task_generators/ruckig_trajectory_smoothing_task_generator.h>
4243#include < tesseract_process_managers/task_generators/check_input_task_generator.h>
4344
4445#include < tesseract_motion_planners/simple/simple_motion_planner.h>
5152
5253namespace tesseract_planning
5354{
54- TaskflowGenerator::UPtr createTrajOptGenerator (bool check_input, bool post_collision_check)
55+ TaskflowGenerator::UPtr createTrajOptGenerator (bool check_input, bool post_collision_check, bool post_smoothing )
5556{
5657 auto tf = std::make_unique<GraphTaskflow>(" TrajOptTaskflow" );
5758
@@ -83,6 +84,11 @@ TaskflowGenerator::UPtr createTrajOptGenerator(bool check_input, bool post_colli
8384 // Setup time parameterization
8485 int time_parameterization_task = tf->addNode (std::make_unique<IterativeSplineParameterizationTaskGenerator>(), true );
8586
87+ // Setup trajectory smoothing
88+ int smoothing_task{ std::numeric_limits<int >::min () };
89+ if (post_smoothing)
90+ smoothing_task = tf->addNode (std::make_unique<RuckigTrajectorySmoothingTaskGenerator>(), true );
91+
8692 if (check_input)
8793 tf->addEdges (check_input_task, { GraphTaskflow::ERROR_NODE, has_seed_task });
8894
@@ -100,13 +106,21 @@ TaskflowGenerator::UPtr createTrajOptGenerator(bool check_input, bool post_colli
100106 tf->addEdges (motion_planner_task, { GraphTaskflow::ERROR_NODE, time_parameterization_task });
101107 }
102108
103- tf->addEdges (time_parameterization_task, { GraphTaskflow::ERROR_NODE, GraphTaskflow::DONE_NODE });
109+ if (post_smoothing)
110+ {
111+ tf->addEdges (time_parameterization_task, { GraphTaskflow::ERROR_NODE, smoothing_task });
112+ tf->addEdges (smoothing_task, { GraphTaskflow::DONE_NODE });
113+ }
114+ else
115+ {
116+ tf->addEdges (time_parameterization_task, { GraphTaskflow::ERROR_NODE, GraphTaskflow::DONE_NODE });
117+ }
104118
105119 return tf;
106120}
107121
108122#ifdef TESSERACT_PROCESS_MANAGERS_HAS_TRAJOPT_IFOPT
109- TaskflowGenerator::UPtr createTrajOptIfoptGenerator (bool check_input, bool post_collision_check)
123+ TaskflowGenerator::UPtr createTrajOptIfoptGenerator (bool check_input, bool post_collision_check, bool post_smoothing )
110124{
111125 auto tf = std::make_unique<GraphTaskflow>(" TrajOptIfoptTaskflow" );
112126
@@ -138,6 +152,11 @@ TaskflowGenerator::UPtr createTrajOptIfoptGenerator(bool check_input, bool post_
138152 // Setup time parameterization
139153 int time_parameterization_task = tf->addNode (std::make_unique<IterativeSplineParameterizationTaskGenerator>(), true );
140154
155+ // Setup trajectory smoothing
156+ int smoothing_task{ std::numeric_limits<int >::min () };
157+ if (post_smoothing)
158+ smoothing_task = tf->addNode (std::make_unique<RuckigTrajectorySmoothingTaskGenerator>(), true );
159+
141160 if (check_input)
142161 tf->addEdges (check_input_task, { GraphTaskflow::ERROR_NODE, has_seed_task });
143162
@@ -155,13 +174,21 @@ TaskflowGenerator::UPtr createTrajOptIfoptGenerator(bool check_input, bool post_
155174 tf->addEdges (motion_planner_task, { GraphTaskflow::ERROR_NODE, time_parameterization_task });
156175 }
157176
158- tf->addEdges (time_parameterization_task, { GraphTaskflow::ERROR_NODE, GraphTaskflow::DONE_NODE });
177+ if (post_smoothing)
178+ {
179+ tf->addEdges (time_parameterization_task, { GraphTaskflow::ERROR_NODE, smoothing_task });
180+ tf->addEdges (smoothing_task, { GraphTaskflow::DONE_NODE });
181+ }
182+ else
183+ {
184+ tf->addEdges (time_parameterization_task, { GraphTaskflow::ERROR_NODE, GraphTaskflow::DONE_NODE });
185+ }
159186
160187 return tf;
161188}
162189#endif
163190
164- TaskflowGenerator::UPtr createOMPLGenerator (bool check_input, bool post_collision_check)
191+ TaskflowGenerator::UPtr createOMPLGenerator (bool check_input, bool post_collision_check, bool post_smoothing )
165192{
166193 auto tf = std::make_unique<GraphTaskflow>(" OMPLTaskflow" );
167194
@@ -193,6 +220,11 @@ TaskflowGenerator::UPtr createOMPLGenerator(bool check_input, bool post_collisio
193220 // Setup time parameterization
194221 int time_parameterization_task = tf->addNode (std::make_unique<IterativeSplineParameterizationTaskGenerator>(), true );
195222
223+ // Setup trajectory smoothing
224+ int smoothing_task{ std::numeric_limits<int >::min () };
225+ if (post_smoothing)
226+ smoothing_task = tf->addNode (std::make_unique<RuckigTrajectorySmoothingTaskGenerator>(), true );
227+
196228 if (check_input)
197229 tf->addEdges (check_input_task, { GraphTaskflow::ERROR_NODE, has_seed_task });
198230
@@ -210,12 +242,20 @@ TaskflowGenerator::UPtr createOMPLGenerator(bool check_input, bool post_collisio
210242 tf->addEdges (motion_planner_task, { GraphTaskflow::ERROR_NODE, time_parameterization_task });
211243 }
212244
213- tf->addEdges (time_parameterization_task, { GraphTaskflow::ERROR_NODE, GraphTaskflow::DONE_NODE });
245+ if (post_smoothing)
246+ {
247+ tf->addEdges (time_parameterization_task, { GraphTaskflow::ERROR_NODE, smoothing_task });
248+ tf->addEdges (smoothing_task, { GraphTaskflow::DONE_NODE });
249+ }
250+ else
251+ {
252+ tf->addEdges (time_parameterization_task, { GraphTaskflow::ERROR_NODE, GraphTaskflow::DONE_NODE });
253+ }
214254
215255 return tf;
216256}
217257
218- TaskflowGenerator::UPtr createDescartesGenerator (bool check_input, bool post_collision_check)
258+ TaskflowGenerator::UPtr createDescartesGenerator (bool check_input, bool post_collision_check, bool post_smoothing )
219259{
220260 auto tf = std::make_unique<GraphTaskflow>(" DescartesTaskflow" );
221261
@@ -247,6 +287,11 @@ TaskflowGenerator::UPtr createDescartesGenerator(bool check_input, bool post_col
247287 // Setup time parameterization
248288 int time_parameterization_task = tf->addNode (std::make_unique<IterativeSplineParameterizationTaskGenerator>(), true );
249289
290+ // Setup trajectory smoothing
291+ int smoothing_task{ std::numeric_limits<int >::min () };
292+ if (post_smoothing)
293+ smoothing_task = tf->addNode (std::make_unique<RuckigTrajectorySmoothingTaskGenerator>(), true );
294+
250295 if (check_input)
251296 tf->addEdges (check_input_task, { GraphTaskflow::ERROR_NODE, has_seed_task });
252297
@@ -264,7 +309,15 @@ TaskflowGenerator::UPtr createDescartesGenerator(bool check_input, bool post_col
264309 tf->addEdges (motion_planner_task, { GraphTaskflow::ERROR_NODE, time_parameterization_task });
265310 }
266311
267- tf->addEdges (time_parameterization_task, { GraphTaskflow::ERROR_NODE, GraphTaskflow::DONE_NODE });
312+ if (post_smoothing)
313+ {
314+ tf->addEdges (time_parameterization_task, { GraphTaskflow::ERROR_NODE, smoothing_task });
315+ tf->addEdges (smoothing_task, { GraphTaskflow::DONE_NODE });
316+ }
317+ else
318+ {
319+ tf->addEdges (time_parameterization_task, { GraphTaskflow::ERROR_NODE, GraphTaskflow::DONE_NODE });
320+ }
268321
269322 return tf;
270323}
0 commit comments