Skip to content

Commit 24ab222

Browse files
Expose convex solver settings and set ospq adaptive_rho to default value (#285)
* Expose convex solver settings and set ospq adaptive_rho to default value * Fix windows CI build * Fix unit tests Co-authored-by: Tyler Marr <[email protected]>
1 parent 1ccd4b3 commit 24ab222

File tree

12 files changed

+72
-33
lines changed

12 files changed

+72
-33
lines changed

.github/workflows/windows_noetic_build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ on:
1212
jobs:
1313
windows_ci:
1414
name: Noetic
15-
runs-on: windows-latest
15+
runs-on: windows-2019
1616
env:
1717
ROS_DISTRO: noetic
1818
steps:

trajopt/include/trajopt/problem_description.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,9 @@ struct BasicInfo
114114
/** @brief The convex solver to use */
115115
sco::ModelType convex_solver;
116116

117+
/** @brief The convex solver configuration settings */
118+
sco::ModelConfig::Ptr convex_solver_config;
119+
117120
/** @brief If true, the last column in the optimization matrix will be 1/dt */
118121
bool use_time = false;
119122

trajopt/src/problem_description.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -539,8 +539,10 @@ TrajOptProb::Ptr ConstructProblem(const Json::Value& root, const tesseract_envir
539539
return ConstructProblem(pci);
540540
}
541541

542+
TrajOptProb::TrajOptProb() = default;
543+
542544
TrajOptProb::TrajOptProb(int n_steps, const ProblemConstructionInfo& pci)
543-
: OptProb(pci.basic_info.convex_solver), m_kin(pci.kin), m_env(pci.env)
545+
: OptProb(pci.basic_info.convex_solver, pci.basic_info.convex_solver_config), m_kin(pci.kin), m_env(pci.env)
544546
{
545547
const Eigen::MatrixX2d& limits = m_kin->getLimits().joint_limits;
546548
auto n_dof = static_cast<int>(m_kin->numJoints());
@@ -570,8 +572,6 @@ TrajOptProb::TrajOptProb(int n_steps, const ProblemConstructionInfo& pci)
570572
m_traj_vars = VarArray(n_steps, n_dof + (pci.basic_info.use_time ? 1 : 0), trajvarvec.data());
571573
}
572574

573-
TrajOptProb::TrajOptProb() = default;
574-
575575
void UserDefinedTermInfo::fromJson(ProblemConstructionInfo& /*pci*/, const Json::Value& /*v*/)
576576
{
577577
PRINT_AND_THROW("UserDefinedTermInfo does not support fromJson!");

trajopt_optimizers/trajopt_sqp/src/osqp_eigen_solver.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ OSQPEigenSolver::OSQPEigenSolver()
3737
solver_.settings()->setVerbosity(false);
3838
solver_.settings()->setWarmStart(true);
3939
solver_.settings()->setPolish(true);
40-
solver_.settings()->setAdaptiveRho(false);
40+
solver_.settings()->setAdaptiveRho(true);
4141
solver_.settings()->setMaxIteration(8192);
4242
solver_.settings()->setAbsoluteTolerance(1e-4);
4343
solver_.settings()->setRelativeTolerance(1e-6);

trajopt_optimizers/trajopt_sqp/test/cart_position_optimization_trajopt_sco_unit.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,11 @@ TEST(CartPositionOptimizationTrajoptSCO, cart_position_optimization_trajopt_sco)
155155

156156
tesseract_common::TrajArray traj = getTraj(opt.x(), prob->GetVars());
157157

158-
for (Eigen::Index i = 0; i < traj.cols(); i++)
159-
EXPECT_NEAR(traj(0, i), joint_target[i], 1.1e-3);
158+
auto optimized_pose = manip->calcFwdKin(traj.row(0)).at("r_gripper_tool_frame");
159+
EXPECT_TRUE(target_pose.translation().isApprox(optimized_pose.translation(), 1e-4));
160+
Eigen::Quaterniond target_q(target_pose.rotation());
161+
Eigen::Quaterniond optimized_q(optimized_pose.rotation());
162+
EXPECT_TRUE(target_q.isApprox(optimized_q, 1e-5));
160163

161164
if (DEBUG)
162165
{

trajopt_optimizers/trajopt_sqp/test/cart_position_optimization_unit.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,8 +152,11 @@ void runCartPositionOptimization(const trajopt_sqp::QPProblem::Ptr& qp_problem,
152152
solver.solve(qp_problem);
153153
Eigen::VectorXd x = qp_problem->getVariableValues();
154154

155-
for (Eigen::Index i = 0; i < joint_target.size(); i++)
156-
EXPECT_NEAR(x[i], joint_target[i], 1.1e-3);
155+
auto optimized_pose = manip->calcFwdKin(x).at("r_gripper_tool_frame");
156+
EXPECT_TRUE(target_pose.translation().isApprox(optimized_pose.translation(), 1e-4));
157+
Eigen::Quaterniond target_q(target_pose.rotation());
158+
Eigen::Quaterniond optimized_q(optimized_pose.rotation());
159+
EXPECT_TRUE(target_q.isApprox(optimized_q, 1e-5));
157160

158161
if (DEBUG)
159162
{

trajopt_sco/include/trajopt_sco/modeling.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,8 @@ class OptProb
197197
public:
198198
using Ptr = std::shared_ptr<OptProb>;
199199

200-
OptProb(ModelType convex_solver = ModelType::AUTO_SOLVER);
200+
OptProb(ModelType convex_solver = ModelType::AUTO_SOLVER,
201+
const ModelConfig::ConstPtr& convex_solver_config = nullptr);
201202
virtual ~OptProb() = default;
202203
OptProb(const OptProb&) = delete;
203204
OptProb& operator=(const OptProb&) = delete;

trajopt_sco/include/trajopt_sco/osqp_interface.hpp

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,17 @@ TRAJOPT_IGNORE_WARNINGS_POP
99

1010
namespace sco
1111
{
12+
/** @brief The OSQP configuration settings */
13+
struct OSQPModelConfig : public ModelConfig
14+
{
15+
using Ptr = std::shared_ptr<OSQPModelConfig>;
16+
using ConstPtr = std::shared_ptr<const OSQPModelConfig>;
17+
18+
OSQPModelConfig();
19+
20+
OSQPSettings settings;
21+
};
22+
1223
/**
1324
* OSQPModel uses the BSD solver OSQP to solve a linearly constrained QP.
1425
* OSQP solves a problem in the form:
@@ -22,9 +33,8 @@ namespace sco
2233
*/
2334
class OSQPModel : public Model
2435
{
25-
OSQPSettings osqp_settings_; /**< OSQP Settings */
26-
/** OSQPData. Some fields here (`osp_data_.A` and `osp_data_.P`) are
27-
* automatically allocated by OSQP, but deallocated by us. */
36+
/** OSQPData. Some fields here (`osp_data_.A` and `osp_data_.P`) are * automatically allocated by OSQP, but
37+
* deallocated by us. */
2838
OSQPData osqp_data_;
2939

3040
/** OSQP Workspace. Memory here is managed by OSQP */
@@ -63,8 +73,10 @@ class OSQPModel : public Model
6373

6474
QuadExpr objective_; /**< objective QuadExpr expression */
6575

76+
OSQPModelConfig config_; /**< The configuration settings */
77+
6678
public:
67-
OSQPModel();
79+
OSQPModel(const ModelConfig::ConstPtr& config = nullptr);
6880
~OSQPModel() override;
6981
OSQPModel(const OSQPModel& model) = delete;
7082
OSQPModel& operator=(const OSQPModel& model) = delete;

trajopt_sco/include/trajopt_sco/solver_interface.hpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,13 @@ class Model
8686
virtual VarVector getVars() const = 0;
8787
};
8888

89+
struct ModelConfig
90+
{
91+
using Ptr = std::shared_ptr<ModelConfig>;
92+
using ConstPtr = std::shared_ptr<const ModelConfig>;
93+
virtual ~ModelConfig() = default;
94+
};
95+
8996
struct VarRep
9097
{
9198
using Ptr = std::shared_ptr<VarRep>;
@@ -232,7 +239,8 @@ std::vector<ModelType> availableSolvers();
232239

233240
std::ostream& operator<<(std::ostream& os, const ModelType& cs);
234241

235-
Model::Ptr createModel(ModelType model_type = ModelType::AUTO_SOLVER);
242+
Model::Ptr createModel(ModelType model_type = ModelType::AUTO_SOLVER,
243+
const ModelConfig::ConstPtr& model_config = nullptr);
236244

237245
void vars2inds(const VarVector& vars, SizeTVec& inds);
238246

trajopt_sco/src/modeling.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,10 @@ DblVec Constraint::violations(const DblVec& x)
160160
}
161161

162162
double Constraint::violation(const DblVec& x) { return vecSum(violations(x)); }
163-
OptProb::OptProb(ModelType convex_solver) : model_(createModel(convex_solver)) {}
163+
OptProb::OptProb(ModelType convex_solver, const ModelConfig::ConstPtr& convex_solver_config)
164+
: model_(createModel(convex_solver, convex_solver_config))
165+
{
166+
}
164167
VarVector OptProb::createVariables(const std::vector<std::string>& names)
165168
{
166169
return createVariables(names, DblVec(names.size(), -INFINITY), DblVec(names.size(), INFINITY));

0 commit comments

Comments
 (0)