Drake中Snopt求解器Exit code 83:整数Workspace不足问题排查
prog = MathematicalProgram()
Z = prog.NewContinuousVariables(N, nz)
U = prog.NewContinuousVariables(N-1, 2)
prog.AddLinearConstraint(Z[0] - z0, np.zeros(nz), np.zeros(nz))
for i in range(N-1):
z_k = z0 if i==0 else Z[i]
s = Z[i+1, nq:]
x_k = z_k[:nq]
v_next = s[:nq]
u = np.concatenate([U[i], np.zeros(nq-2)])
for row in dynamics_residual(z_k, s, u, params):
prog.AddQuadraticConstraint(row, 0, 0, hessian_type=QuadraticConstraint.HessianType.kIndefinite)
prog.AddLinearConstraint(Z[i+1, :nq] - (x_k + dt*v_next), np.zeros(nq), np.zeros(nq))
for i, hand_pos in enumerate(hand_path[:-1]):
prog.AddLinearConstraint(hand_pos - Z[i, :2], np.zeros(2), np.zeros(2))
solver = SnoptSolver()
filename = "/tmp/debug.txt"
solver_options = SolverOptions()
solver_options.SetOption(CommonSolverOption.kPrintFileName, filename)
solver_options.SetOption(SnoptSolver.id(), "Total integer workspace", 1e6)
solver_options.SetOption(SnoptSolver.id(), "Total real workspace", 4e6)
solver_options.SetOption(SnoptSolver.id(), "User integer workspace", 1e6)
solver_options.SetOption(SnoptSolver.id(), "User real workspace", 4e6)
solver_options.SetOption(SnoptSolver.id(), "Major print level", 5)
result = solver.Solve(prog, solver_options=solver_options)
...
### Snopt输出信息
lu1fac error... insufficient storage
Increase lena from 166326 to at least 243971
Current Recommended
Total integer workspace 632738 788028
Total real workspace 2850909 2928554
1
SNOPTA EXIT 80 -- insufficient storage allocated
SNOPTA INFO 83 -- not enough integer storage
### 解决方案 1. **修正参数类型**:Snopt的工作区选项要求传入整数,你用的`1e6`是浮点数,会被求解器忽略,导致设置不生效。把所有工作区数值改成整数,比如`1000000`。 2. **按推荐值配置**:根据Snopt输出的推荐值,将`Total integer workspace`设为至少`788028`,`Total real workspace`设为至少`2928554`,可以适当留余量(比如设为800000和3000000)。 3. **设置Lena参数**:输出明确提示需要将`lena`从166326增加到至少243971,直接添加该选项: ```python solver_options.SetOption(SnoptSolver.id(), "Lena", 250000)
修改后的选项设置示例:
solver_options.SetOption(SnoptSolver.id(), "Total integer workspace", 800000) solver_options.SetOption(SnoptSolver.id(), "Total real workspace", 3000000) solver_options.SetOption(SnoptSolver.id(), "Lena", 250000)
- 优化问题结构:如果调整参数后仍有问题,检查是否可以减少约束或变量数量,比如合并重复的二次约束,或者用更高效的方式表达动力学残差。
内容的提问来源于stack exchange,提问作者Krishna Suresh

