如何访问Drake Toolbox构建的优化问题解及自动选择QP求解器
问题1:无法获取求解结果的代码错误原因
- 核心错误:你声明了
drake::solvers::MathematicalProgramResult result对象,但调用osqp_solver.Solve()时没有将求解返回的结果赋值给该对象,result始终处于未填充的空状态,自然无法读取求解结果。 - 额外冗余问题:代码中的
for (int print_to_console : {0, 0})属于无意义逻辑,会连续两次调用求解器且两次都设置为非verbose模式,最终只有第二次求解的结果会生效,没有实际作用,可以直接去掉循环,只保留一次求解逻辑。 - 修正后的代码片段:
drake::solvers::MathematicalProgram prog; auto x = prog.NewContinuousVariables(n_x); // Cost and Constraints drake::solvers::MathematicalProgramResult result; drake::solvers::OsqpSolver osqp_solver; if (osqp_solver.available()) { drake::solvers::SolverOptions options; // 按需设置verbose级别,0为不打印,1为打印详细日志 options.SetOption(drake::solvers::OsqpSolver::id(), "verbose", 0); // 把求解结果赋值给result对象 result = osqp_solver.Solve(prog, {}, options); } // 建议先判断求解是否成功再读取结果,避免异常 if (result.is_success()) { const auto u = result.GetSolution(x); // 后续处理u的逻辑 }
问题2:Drake自动选择QP求解器的方法
不需要手动实例化特定求解器,直接调用Drake封装的顶层Solve函数即可,框架会自动根据你的数学规划类型(这里是QP)和当前环境已安装的可用求解器,自动选择最优的求解器进行求解,示例代码如下:
drake::solvers::MathematicalProgram prog; auto x = prog.NewContinuousVariables(n_x); // Cost and Constraints // 无需指定求解器,直接调用顶层Solve函数 drake::solvers::SolverOptions options; // 可全局设置通用求解参数,也可以针对特定求解器设置参数 options.SetOption(drake::solvers::CommonSolverOption::kVerbose, 0); // 支持传入初始猜测和求解配置,无初始猜测传空即可 auto result = drake::solvers::Solve(prog, {}, options); if (result.is_success()) { const auto u = result.GetSolution(x); }
内容的提问来源于stack exchange,提问作者skywalker
相关产品推荐
相关产品推荐

