Skip to content

Commit 7be7c49

Browse files
committed
modify trajectory spreading
1 parent b08c54a commit 7be7c49

File tree

2 files changed

+26
-18
lines changed

2 files changed

+26
-18
lines changed

ocs2_ipm/src/IpmSolver.cpp

+23-9
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4141
#include <ocs2_oc/multiple_shooting/PerformanceIndexComputation.h>
4242
#include <ocs2_oc/multiple_shooting/Transcription.h>
4343
#include <ocs2_oc/oc_problem/OcpSize.h>
44+
#include <ocs2_oc/trajectory_adjustment/TrajectorySpreadingHelperFunctions.h>
4445

4546
#include "ocs2_ipm/IpmHelpers.h"
4647
#include "ocs2_ipm/IpmInitialization.h"
@@ -205,7 +206,28 @@ void IpmSolver::runImpl(scalar_t initTime, const vector_t& initState, scalar_t f
205206
ocpDefinition.targetTrajectoriesPtr = &targetTrajectories;
206207
}
207208

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_
209231
vector_array_t x, u;
210232
multiple_shooting::initializeStateInputTrajectories(initState, timeDiscretization, primalSolution_, *initializerPtr_, x, u);
211233

@@ -216,14 +238,6 @@ void IpmSolver::runImpl(scalar_t initTime, const vector_t& initState, scalar_t f
216238
initializeProjectionMultiplierTrajectory(timeDiscretization, nu);
217239
}
218240

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-
227241
// Bookkeeping
228242
performanceIndeces_.clear();
229243
std::vector<Metrics> metrics;

ocs2_ipm/src/IpmTrajectoryAdjustment.cpp

+3-9
Original file line numberDiff line numberDiff line change
@@ -38,19 +38,13 @@ namespace {
3838
MultiplierCollection toMultiplierCollection(vector_t&& stateIneq, vector_t&& stateInputIneq = vector_t()) {
3939
MultiplierCollection multiplierCollection;
4040
multiplierCollection.stateIneq.emplace_back(0.0, std::move(stateIneq));
41-
if (stateInputIneq.size() > 0) {
42-
multiplierCollection.stateInputIneq.emplace_back(0.0, std::move(stateInputIneq));
43-
}
41+
multiplierCollection.stateInputIneq.emplace_back(0.0, std::move(stateInputIneq));
4442
return multiplierCollection;
4543
}
4644

4745
std::pair<vector_t, vector_t> fromMultiplierCollection(MultiplierCollection&& multiplierCollection) {
48-
if (multiplierCollection.stateInputIneq.empty()) {
49-
return std::make_pair(std::move(multiplierCollection.stateIneq.front().lagrangian), vector_t());
50-
} else {
51-
return std::make_pair(std::move(multiplierCollection.stateIneq.front().lagrangian),
52-
std::move(multiplierCollection.stateInputIneq.front().lagrangian));
53-
}
46+
return std::make_pair(std::move(multiplierCollection.stateIneq.front().lagrangian),
47+
std::move(multiplierCollection.stateInputIneq.front().lagrangian));
5448
}
5549
} // namespace
5650
} // namespace ocs2

0 commit comments

Comments
 (0)