@@ -41,6 +41,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
41
41
#include < ocs2_oc/multiple_shooting/PerformanceIndexComputation.h>
42
42
#include < ocs2_oc/multiple_shooting/Transcription.h>
43
43
#include < ocs2_oc/oc_problem/OcpSize.h>
44
+ #include < ocs2_oc/trajectory_adjustment/TrajectorySpreadingHelperFunctions.h>
44
45
45
46
#include " ocs2_ipm/IpmHelpers.h"
46
47
#include " ocs2_ipm/IpmInitialization.h"
@@ -205,7 +206,28 @@ void IpmSolver::runImpl(scalar_t initTime, const vector_t& initState, scalar_t f
205
206
ocpDefinition.targetTrajectoriesPtr = &targetTrajectories;
206
207
}
207
208
208
- // Initialize the state and input
209
+ // Interior point variables
210
+ scalar_t barrierParam = settings_.initialBarrierParameter ;
211
+ vector_array_t slackStateIneq, slackStateInputIneq, dualStateIneq, dualStateInputIneq;
212
+ if (!slackIneqTrajectory_.timeTrajectory .empty ()) {
213
+ const auto & newModeSchedule = this ->getReferenceManager ().getModeSchedule ();
214
+ std::tie (slackStateIneq, slackStateInputIneq) = ipm::interpolateInteriorPointTrajectory (
215
+ primalSolution_.modeSchedule_ , newModeSchedule, timeDiscretization, std::move (slackIneqTrajectory_));
216
+ std::tie (dualStateIneq, dualStateInputIneq) = ipm::interpolateInteriorPointTrajectory (
217
+ primalSolution_.modeSchedule_ , newModeSchedule, timeDiscretization, std::move (dualIneqTrajectory_));
218
+ } else {
219
+ slackStateIneq.resize (timeDiscretization.size ());
220
+ slackStateInputIneq.resize (timeDiscretization.size () - 1 );
221
+ dualStateIneq.resize (timeDiscretization.size ());
222
+ dualStateInputIneq.resize (timeDiscretization.size () - 1 );
223
+ }
224
+
225
+ // Trajectory spread of primalSolution_ after trajectory spread of the interior point variables
226
+ if (!primalSolution_.timeTrajectory_ .empty ()) {
227
+ std::ignore = trajectorySpread (primalSolution_.modeSchedule_ , this ->getReferenceManager ().getModeSchedule (), primalSolution_);
228
+ }
229
+
230
+ // Initialize the state and input after trajectory spread of primalSolution_
209
231
vector_array_t x, u;
210
232
multiple_shooting::initializeStateInputTrajectories (initState, timeDiscretization, primalSolution_, *initializerPtr_, x, u);
211
233
@@ -216,14 +238,6 @@ void IpmSolver::runImpl(scalar_t initTime, const vector_t& initState, scalar_t f
216
238
initializeProjectionMultiplierTrajectory (timeDiscretization, nu);
217
239
}
218
240
219
- // Interior point variables
220
- scalar_t barrierParam = settings_.initialBarrierParameter ;
221
- vector_array_t slackStateIneq, slackStateInputIneq, dualStateIneq, dualStateInputIneq;
222
- std::tie (slackStateIneq, slackStateInputIneq) = ipm::interpolateInteriorPointTrajectory (
223
- primalSolution_.modeSchedule_ , this ->getReferenceManager ().getModeSchedule (), timeDiscretization, std::move (slackIneqTrajectory_));
224
- std::tie (dualStateIneq, dualStateInputIneq) = ipm::interpolateInteriorPointTrajectory (
225
- primalSolution_.modeSchedule_ , this ->getReferenceManager ().getModeSchedule (), timeDiscretization, std::move (dualIneqTrajectory_));
226
-
227
241
// Bookkeeping
228
242
performanceIndeces_.clear ();
229
243
std::vector<Metrics> metrics;
0 commit comments