KinematicTrajectoryOptimization能否支持Gurobi求解器?遇泛型约束不支持异常
KinematicTrajectoryOptimization能否支持Gurobi求解器?
当前KinematicTrajectoryOptimization仅原生支持SNOPT或IFOPT求解器,直接使用Gurobi会触发异常,核心原因是你添加的部分约束(如路径速度/位置约束)被封装为GenericConstraint类型,而GurobiSolver并未实现对这类泛型约束的解析支持,报错内容如下:
GurobiSolver无法求解,因为声明了GenericConstraint但不支持该约束
问题复现代码
EXPECT_EQ(trajopt_.prog().linear_constraints().size(), 0); VectorXd desired = VectorXd::Ones(num_positions_); auto binding = trajopt_.AddPathVelocityConstraint(desired, desired, 0.5); std::cout << "path velocity constraint:\t" << binding.to_string() << std::endl; EXPECT_THAT(binding.to_string(), HasSubstr("path velocity constraint")); EXPECT_EQ(trajopt_.prog().linear_constraints().size(), 1); // r(0) = 0, r(1) = 1. trajopt_.AddPathPositionConstraint(VectorXd::Zero(num_positions_), VectorXd::Zero(num_positions_), 0); trajopt_.AddPathPositionConstraint(VectorXd::Ones(num_positions_),VectorXd::Ones(num_positions_), 1); auto lb = VectorXd::Constant(3, -10); auto ub = VectorXd::Constant(3, 10); trajopt_.AddAccelerationBounds(lb, ub); trajopt_.AddDurationConstraint(1, 1); trajopt_.AddDurationCost(50); GurobiSolver solver; solver.Solve(trajopt_.prog());
报错详情
unknown file: Failure
C++ exception with description "GurobiSolver无法求解,因为声明了GenericConstraint但不支持该约束" thrown in the test body.
可行解决方案
- 替换约束类型:检查KinematicTrajectoryOptimization的API,将生成GenericConstraint的方法(如
AddPathVelocityConstraint)替换为Gurobi支持的线性/显式非线性约束。比如手动拆解路径速度约束为线性等式/不等式,直接添加到规划问题中。 - 扩展GurobiSolver:修改GurobiSolver的代码,添加对GenericConstraint的适配逻辑——将泛型约束中的函数表达式转换为Gurobi可识别的约束(需利用Gurobi C++ API添加自定义非线性约束,同时确保约束提供梯度计算逻辑)。
- 临时替代:若无法修改代码,继续使用SNOPT或IFOPT求解器,它们对KinematicTrajectoryOptimization的所有约束类型原生兼容。
内容的提问来源于stack exchange,提问作者xing bing
相关产品推荐
相关产品推荐

