From 53baa3287aef029bd089d437fdad621df3f4d6d1 Mon Sep 17 00:00:00 2001 From: Iori Kumagai Date: Wed, 4 Feb 2026 17:50:45 +0900 Subject: [PATCH 1/2] [DdpCentroidal] Preserve latest returned value from ddp_solver_ to check whether ddp_solver_->solve() is successfully solved --- include/CCC/DdpCentroidal.h | 3 +++ src/DdpCentroidal.cpp | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/include/CCC/DdpCentroidal.h b/include/CCC/DdpCentroidal.h index 8375a65..71c4bf4 100644 --- a/include/CCC/DdpCentroidal.h +++ b/include/CCC/DdpCentroidal.h @@ -362,5 +362,8 @@ class DdpCentroidal //! Force scale limits (i.e., limits of \f$\lambda_i\f$ in the order of lower, upper) std::array force_scale_limits_ = {0.0, 1e6}; + + //! Latest returned value from DDP solver + bool ddp_solved_ = false; }; } // namespace CCC diff --git a/src/DdpCentroidal.cpp b/src/DdpCentroidal.cpp index e09b242..404c703 100644 --- a/src/DdpCentroidal.cpp +++ b/src/DdpCentroidal.cpp @@ -226,11 +226,11 @@ Eigen::VectorXd DdpCentroidal::planOnce(const std::function double t = current_time + i * ddp_problem_->dt(); current_u_list.push_back(DdpProblem::InputDimVector::Zero(ddp_problem_->inputDim(t))); } - ddp_solver_->solve(current_time, initial_param.toState(ddp_problem_->mass_), current_u_list); + ddp_solved_ = ddp_solver_->solve(current_time, initial_param.toState(ddp_problem_->mass_), current_u_list); } else { - ddp_solver_->solve(current_time, initial_param.toState(ddp_problem_->mass_), initial_param.u_list); + ddp_solved_ = ddp_solver_->solve(current_time, initial_param.toState(ddp_problem_->mass_), initial_param.u_list); } return ddp_solver_->controlData().u_list[0]; From 841783133a5415d610a6ceb616431ee41c4ba8ed Mon Sep 17 00:00:00 2001 From: Iori Kumagai Date: Fri, 6 Mar 2026 17:46:32 +0900 Subject: [PATCH 2/2] add ddp_solved_ flag to DdpZmp and DdpSingleRigidBody --- include/CCC/DdpSingleRigidBody.h | 3 +++ include/CCC/DdpZmp.h | 3 +++ src/DdpSingleRigidBody.cpp | 4 ++-- src/DdpZmp.cpp | 8 ++++---- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/include/CCC/DdpSingleRigidBody.h b/include/CCC/DdpSingleRigidBody.h index 86e9eac..5618665 100644 --- a/include/CCC/DdpSingleRigidBody.h +++ b/include/CCC/DdpSingleRigidBody.h @@ -402,5 +402,8 @@ class DdpSingleRigidBody //! Force scale limits (i.e., limits of \f$\lambda_i\f$ in the order of lower, upper) std::array force_scale_limits_ = {0.0, 1e6}; + + //! Latest returned value from DDP solver + bool ddp_solved_ = false; }; } // namespace CCC diff --git a/include/CCC/DdpZmp.h b/include/CCC/DdpZmp.h index 71bab6f..c6b5a93 100644 --- a/include/CCC/DdpZmp.h +++ b/include/CCC/DdpZmp.h @@ -297,5 +297,8 @@ class DdpZmp //! DDP solver std::shared_ptr> ddp_solver_; + + //! Latest returned value from DDP solver + bool ddp_solved_ = false; }; } // namespace CCC diff --git a/src/DdpSingleRigidBody.cpp b/src/DdpSingleRigidBody.cpp index c09a9c3..e44ec2b 100644 --- a/src/DdpSingleRigidBody.cpp +++ b/src/DdpSingleRigidBody.cpp @@ -296,11 +296,11 @@ Eigen::VectorXd DdpSingleRigidBody::planOnce(const std::functiondt(); current_u_list.push_back(DdpProblem::InputDimVector::Zero(ddp_problem_->inputDim(t))); } - ddp_solver_->solve(current_time, initial_param.toState(), current_u_list); + ddp_solved_ = ddp_solver_->solve(current_time, initial_param.toState(), current_u_list); } else { - ddp_solver_->solve(current_time, initial_param.toState(), initial_param.u_list); + ddp_solved_ = ddp_solver_->solve(current_time, initial_param.toState(), initial_param.u_list); } return ddp_solver_->controlData().u_list[0]; diff --git a/src/DdpZmp.cpp b/src/DdpZmp.cpp index ef361f9..c791966 100644 --- a/src/DdpZmp.cpp +++ b/src/DdpZmp.cpp @@ -157,13 +157,13 @@ DdpZmp::PlannedData DdpZmp::planOnce(const std::function & ref_ if(initial_param.u_list.empty()) { - ddp_solver_->solve(current_time, initial_param.toState(), - std::vector(ddp_solver_->config().horizon_steps, - DdpProblem::InputDimVector::Zero())); + ddp_solved_ = ddp_solver_->solve(current_time, initial_param.toState(), + std::vector(ddp_solver_->config().horizon_steps, + DdpProblem::InputDimVector::Zero())); } else { - ddp_solver_->solve(current_time, initial_param.toState(), initial_param.u_list); + ddp_solved_ = ddp_solver_->solve(current_time, initial_param.toState(), initial_param.u_list); } PlannedData planned_data;