使用Drake设计LQR控制器时遭遇抽象值端口错误的咨询
问题解答
错误含义解析
- 抽象值端口指的是该端口传输的数据并非数值向量类型(如float/double数组),而是Drake定义的抽象数据结构(比如SceneGraph的几何查询结果、场景图消息这类非数值型数据)。
Linearize函数底层依赖的FirstOrderTaylorApproximation只能处理数值向量类型的输入输出端口,因为线性化需要对数值计算雅克比矩阵,抽象类型无法进行求导运算,因此触发该错误。
代码问题分析
你直接对绑定了SceneGraph的MultibodyPlant调用Linearize,此时系统会包含SceneGraph相关的抽象输入/输出端口,这些端口不属于动力学分析需要的数值端口,导致线性化工具误将抽象端口纳入处理范围。
修复方案
修改Linearize调用,明确指定要线性化的输入端口(驱动输入端口)和输出端口(状态输出端口),避免包含抽象端口:
# 替换原Linearize调用代码 actuation_port = plant.get_actuation_input_port() state_output_port = plant.get_state_output_port() linear = Linearize(plant, context, input_port_indexes=[actuation_port.get_index()], output_port_indexes=[state_output_port.get_index()])
另外,你代码中MatrixGain(-K )这一行是无效冗余代码,直接保留controller = builder.AddSystem(MatrixGain(-K))即可。
内容的提问来源于stack exchange,提问作者TDillon97
相关产品推荐
相关产品推荐

