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

FiniteHorizonLinearQuadraticRegulator报错:环境无u(0)变量条目解析及解决

解决FHLQR报错:"The following environment does not have an entry for the variable u(0)"

报错含义解析

这个错误的核心很明确:当你调用MakeFiniteHorizonLinearQuadraticRegulator时,它需要从你提供的输入轨迹options.u0中读取初始时刻(t0)的输入值,但在对应的植物(plant)上下文里,找不到对应输入端口的变量u(0)。这里的u(0)是Drake对第一个输入端口的默认命名,而你的输入变量叫u1,这就出现了变量命名/绑定不匹配的问题——哪怕你试过改输入名为u,可能也没解决轨迹与端口的绑定问题。

具体解决步骤

我给你梳理几个针对性的排查和修复方法:

1. 重构输入轨迹时绑定到指定输入端口

你之前直接调用dircol.ReconstructInputTrajectory(result),可能没有把轨迹和植物的输入端口关联起来。试试显式指定输入端口:

options.u0 = dircol.ReconstructInputTrajectory(result, plant.get_input_port(0))

这样重构出来的输入轨迹会和植物的第一个输入端口强绑定,变量名也会和端口的默认命名(u(0))对齐,让FHLQR能正确找到对应变量。

2. 显式设置上下文的初始输入值

即使你用过FixValue,可能没精准对应到t0时刻的输入值。先从轨迹里取出t0的输入,再设置到上下文:

t0 = options.u0.start_time()
# 获取t0时刻的输入值
u0_val = options.u0.value(t0)
# 绑定到输入端口
plant.get_input_port(0).FixValue(context, u0_val)

这一步确保上下文在FHLQR需要的初始时刻有明确的输入值。

3. 检查时间范围的一致性

有时候浮点精度问题会导致options.u0.start_time()和你传给FHLQR的t0有微小差异,导致找不到对应时刻的输入。先打印确认:

print(f"Input trajectory start time: {options.u0.start_time()}")
print(f"FHLQR t0: {t0}")

如果有差异,直接用options.u0.start_time()作为FHLQR的t0参数,避免手动输入带来的误差。

4. 验证输入端口的配置

可以打印植物输入端口的详细信息,确认变量名和绑定情况:

input_port = plant.get_input_port(0)
print(f"Input port name: {input_port.get_name()}")
print(f"Associated variable: {input_port.get_variable().get_name()}")

如果端口关联的变量确实是u1而不是u(0),你可以尝试在构建SymbolicVectorSystem时把输入命名改为u(结合步骤1的端口绑定可能会生效):

ctrl_input = [Variable("u")]  # 把u1改成u

额外说明

你提到换成LinearQuadraticRegulator也报同样的错,说明问题不是FHLQR特有的,而是输入轨迹与植物上下文的绑定逻辑出了问题——上面的步骤都是围绕修复这个绑定关系展开的,应该能解决你的问题。

内容的提问来源于stack exchange,提问作者Eric Boehlke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 16:48:10