oc_problem 文件夹
OcpSize.h & OcpSize.cpp
定义了结构体
OcpSize
和两个函数OcpSize
结构体:- 该结构体表示使用 HpipmInterface 解决的最优控制问题(OCP)的大小。
- 它包含了多个成员变量:
numStages
:整数,表示 OCP 中的阶段数。numInputs
:存储每个阶段输入数量的向量。numStates
:存储每个阶段状态数量的向量。numInputBoxConstraints
:存储每个阶段输入箱不等式约束数量的向量。numStateBoxConstraints
:存储每个阶段状态箱不等式约束数量的向量。numIneqConstraints
:存储每个阶段一般不等式约束数量的向量。numInputBoxSlack
:存储每个阶段输入箱不等式松弛变量数量的向量。numStateBoxSlack
:存储每个阶段状态箱不等式松弛变量数量的向量。numIneqSlack
:存储每个阶段一般不等式松弛变量数量的向量。- 它提供了一个构造函数,用于使用默认值初始化结构体。
- 它重载了相等比较运算符(
operator==
),用于比较两个OcpSize
实例是否相等。
operator==
函数:- 这是一个定义在命名空间外部的全局函数,用于比较两个
OcpSize
实例是否相等。 - 它以两个
OcpSize
实例作为输入参数,并在它们相等时返回true
,否则返回false
。
extractSizesFromProblem
函数:- 该函数基于提供的问题数据提取大小。
- 它接受三个参数:
dynamics
:离散动态的线性化近似。cost
:成本的二次近似。constraints
:约束的线性化近似,其中所有约束在 HPIPM 中都映射为不等式约束。- 它返回一个
OcpSize
对象,表示根据输入问题数据派生的大小。
OptimalControlProblem.h & OptimalControlProblem.cpp
OptimalControlProblem
结构体定义了优化控制问题所需的各类信息。每个成员变量均为一个指向不同类型集合的智能指针,用以管理该问题中的各类成本、约束、拉格朗日乘数和动力学。成员变量
- 成本相关指针:
costPtr
:中间成本。stateCostPtr
:仅状态的中间成本。preJumpCostPtr
:跳跃前成本。finalCostPtr
:最终成本。
- 软约束相关指针:
softConstraintPtr
:中间软约束惩罚。stateSoftConstraintPtr
:仅状态的中间软约束惩罚。preJumpSoftConstraintPtr
:跳跃前软约束惩罚。finalSoftConstraintPtr
:最终软约束惩罚。
- 等式约束相关指针:
equalityConstraintPtr
:中间等式约束,对输入来说是满秩的。stateEqualityConstraintPtr
:仅状态的中间等式约束。preJumpEqualityConstraintPtr
:跳跃前等式约束。finalEqualityConstraintPtr
:最终等式约束。
- 不等式约束相关指针:
inequalityConstraintPtr
:中间不等式约束。stateInequalityConstraintPtr
:仅状态的中间不等式约束。preJumpInequalityConstraintPtr
:跳跃前不等式约束。finalInequalityConstraintPtr
:最终不等式约束。
- 拉格朗日乘数相关指针:
equalityLagrangianPtr
:中间等式约束的拉格朗日乘数。stateEqualityLagrangianPtr
:仅状态的中间等式约束的拉格朗日乘数。inequalityLagrangianPtr
:中间不等式约束的拉格朗日乘数。stateInequalityLagrangianPtr
:仅状态的中间不等式约束的拉格朗日乘数。preJumpEqualityLagrangianPtr
:跳跃前等式约束的拉格朗日乘数。preJumpInequalityLagrangianPtr
:跳跃前不等式约束的拉格朗日乘数。finalEqualityLagrangianPtr
:最终等式约束的拉格朗日乘数。finalInequalityLagrangianPtr
:最终不等式约束的拉格朗日乘数。
- 动力学相关指针:
dynamicsPtr
:系统动力学指针。
- 杂项:
preComputationPtr
:预计算模块指针。targetTrajectoriesPtr
:成本的目标轨迹(将由ReferenceManager
替换)。
构造函数和成员函数
- 默认构造函数:初始化各智能指针指向新的集合实例,并将目标轨迹指针初始化为
nullptr
。
- 拷贝构造函数:通过克隆方法对各智能指针进行深拷贝,确保拷贝对象和原对象指向不同的内存区域。
- 拷贝赋值运算符:利用拷贝构造函数和交换函数实现赋值操作,确保异常安全性。
- 交换函数:交换当前对象和另一个
OptimalControlProblem
对象的所有成员变量,提供异常安全的交换机制。
OptimalControlProblemHelperFunction.h & OptimalControlProblemHelperFunction.cpp
用于初始化和更新优化控制问题的对偶解(dual solution)以及相关的乘子(multiplier)
initializeDualSolution
: 这个函数用于初始化对偶解,根据给定的优化控制问题、原始解、缓存的对偶解等参数。它首先确定是否需要进行插值,然后根据情况初始化最终状态、跳跃状态和中间状态的对偶解。
initializeFinalMultiplierCollection
: 这个函数用于初始化最终时间点的乘子集合,主要是为了等式和不等式的拉格朗日函数。
initializePreJumpMultiplierCollection
: 这个函数用于初始化跳跃点之前的乘子集合,同样包括等式和不等式的拉格朗日函数。
initializeIntermediateMultiplierCollection
: 这个函数用于初始化中间时间点的乘子集合,同样包括等式和不等式的拉格朗日函数。
updateDualSolution
: 这个函数用于更新对偶解,根据给定的优化控制问题、原始解和问题度量等参数。它会更新最终状态、跳跃状态和中间状态的对偶解,并且更新相关的问题度量。
updateFinalMultiplierCollection
: 这个函数用于更新最终时间点的乘子集合,同样包括等式和不等式的拉格朗日函数。
updatePreJumpMultiplierCollection
: 这个函数用于更新跳跃点之前的乘子集合,同样包括等式和不等式的拉格朗日函数。
updateIntermediateMultiplierCollection
: 这个函数用于更新中间时间点的乘子集合,同样包括等式和不等式的拉格朗日函数。
extractFinalTermConstraint
: 这个函数用于从给定的度量中提取最终约束项的值,可以是等式约束或不等式约束。
extractFinalTermLagrangianMetrics
: 这个函数用于从给定的度量中提取最终时刻的拉格朗日函数项。
extractPreJumpTermConstraint
: 这个函数用于从给定的度量数组中提取跳跃点之前约束项的值,同样可以是等式约束或不等式约束。
extractPreJumpTermLagrangianMetrics
: 这个函数用于从给定的度量数组中提取跳跃点之前的拉格朗日函数项。
extractIntermediateTermConstraint
: 这个函数用于从给定的度量轨迹中提取中间时间点约束项的值。
extractIntermediateTermLagrangianMetrics
: 这个函数用于从给定的度量轨迹中提取中间时间点的拉格朗日函数项。
extractFinalTermMultiplier
: 这个函数用于从给定的乘子集合中提取最终时刻的乘子。
extractPreJumpTermMultiplier
: 这个函数用于从给定的乘子集合数组中提取跳跃点之前的乘子。
extractIntermediateTermMultiplier
: 这个函数用于从给定的乘子集合轨迹中提取中间时间点的乘子。