You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Drake新版本中如何自定义非线性约束?求NonLinearConstraint替代方案

Drake新版非线性约束设计方案

旧版的drake::solvers::NonLinearConstraint已被移除,现在所有约束统一基于drake::solvers::Constraint抽象类实现,同时提供了更便捷的工厂函数快速创建非线性约束,具体方案如下:

1. 最便捷方式:用工厂函数创建

无需手动继承类,直接通过lambda定义约束评估逻辑即可,推荐优先使用:

#include "drake/solvers/constraint.h"

// 示例:创建约束 x₀² + x₁² ≤ 1
auto my_nonlinear_constraint = drake::solvers::MakeNonlinearConstraint(
    2,  // 输入变量维度
    1,  // 约束输出维度
    // 计算约束值的函数:y = x₀² + x₁²
    [](const Eigen::Ref<const Eigen::VectorXd>& x, Eigen::VectorXd* y) {
        (*y)(0) = x(0)*x(0) + x(1)*x(1);
    },
    // 计算约束雅可比矩阵的函数
    [](const Eigen::Ref<const Eigen::VectorXd>& x, drake::solvers::MatrixXd* dy_dx) {
        *dy_dx = Eigen::RowVector2d(2*x(0), 2*x(1));
    },
    Eigen::VectorXd::Zero(1),  // 约束下限:0 ≤ y
    Eigen::VectorXd::Ones(1)   // 约束上限:y ≤ 1
);

如果不想手动编写雅可比矩阵,可使用自动微分版本的工厂函数,Drake会自动推导:

auto auto_diff_constraint = drake::solvers::MakeAutoDiffNonlinearConstraint(
    2, 1,
    [](const drake::AutoDiffVecXd& x) {
        drake::AutoDiffVecXd y(1);
        y(0) = x(0)*x(0) + x(1)*x(1);
        return y;
    },
    Eigen::VectorXd::Zero(1), Eigen::VectorXd::Ones(1)
);

2. 自定义复杂约束:继承Constraint类

如果约束需要维护内部状态或有更复杂的逻辑,可以直接继承Constraint抽象类实现:

#include "drake/solvers/constraint.h"

class CustomNonlinearConstraint : public drake::solvers::Constraint {
public:
    // 构造函数:指定输入维度、输出维度、约束上下限
    CustomNonlinearConstraint() : Constraint(2, 1, Eigen::VectorXd::Zero(1), Eigen::VectorXd::Ones(1)) {}

    // 实现约束值计算
    void DoEval(const Eigen::Ref<const Eigen::VectorXd>& x, Eigen::VectorXd* y) const override {
        (*y)(0) = x(0)*x(0) + x(1)*x(1);
    }

    // 可选:实现带雅可比的计算(用于手动优化性能)
    void DoEval(const Eigen::Ref<const Eigen::VectorXd>& x, Eigen::VectorXd* y, drake::solvers::MatrixXd* dy_dx) const override {
        DoEval(x, y);
        *dy_dx = Eigen::RowVector2d(2*x(0), 2*x(1));
    }
};

// 使用时直接实例化
CustomNonlinearConstraint constraint_instance;

3. 关键注意事项

  • 头文件统一使用 <drake/solvers/constraint.h>,旧的nonlinear_constraint.h已被移除
  • 所有约束(线性、非线性)现在都统一在Constraint体系下,API更一致

内容的提问来源于stack exchange,提问作者lo Aocby

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 01:05:23