drake - Drake 中输入和输出端口之间的仿射关系
问题描述
假设我有一个Diagram
带输入端口和输出端口的 Drake。我碰巧知道,在保持图表状态不变的情况下,这些输入和输出端口具有仿射关系,即 y = A(x) u + b(x) 其中 x 是 的完整状态Diagram
。然而,图表不是明确的,AffineSystem
因为它对状态的依赖是非线性的。
为图表的给定状态生成相应AffineSystem
的或提取矩阵 A 和 b 的最佳方法是什么?目前,我正在使用
# set state
context.get_mutable_continuous_state_vector().SetFromVector(x)
# inputs to zero to get affine term
diagram.get_input_port().FixValue(context, np.zeros(k))
b = diagram.get_output_port().Eval(context)
# get linear term coefficient matrix
linearized = Linearize(
diagram,
context,
input_index,
output_index,
equilibrium_check_tolerance=1e20
)
A = linearized.D()
公差基本上只是迫使德雷克线性化系统,1e20
即使它不处于平衡状态。但我想知道是否有更原则的方法来做到这一点。
我想这样做的原因类似于这个用户关于欠驱动系统的输入分配的问题。对于由 a 、 和 a 组成的图表MultibodyPlant
,Propeller
它将Multiplexer
输入端口多路复用到Propeller
命令和JointActuator
命令,我想计算输入和广义加速度之间的仿射关系,因此我可以在 QP 中使用这些数据进行输入分配。
在此先感谢您的帮助!
解决方案
这可能不是一个好方法,但您可以考虑通过以下过程获得 A(x) 和 b(x)
- 首先修复
u
为 0,然后 xdot 就是 b(x),正如您已经完成的那样。 - 现在固定
u
为 [1, 0, 0, ..., 0],则 xdot 为 b(x) + A(x).col(0)。从这个结果中减去从第 1 步获得的 b(x),剩下的就是 A(x).col(0)。 - 通过设置单位向量 eᵢ 重复步骤 2
u
,使得 eᵢ(j) = δ(i, j)。然后你得到 A(x) 的第 i 列。
推荐阅读
- java - jsonObjectRequest 错误,总是以 onErrorResponse 方法结束
- php - wordpress 链接让我找不到 404
- c - 如何在c中读取.docx文件
- python - 从另一个类修改一个类的功能
- javascript - 根据title属性值搜索表格内容
- wordpress - Wordpress - 媒体库上传时出错。请稍后再试
- php - 如何检索与先前提取的列具有相似列的行?
- css - 提交的 div 没有出现在底部
- mysql - MySQL 5.6 中生成列的替代方法是什么
- compiler-construction - 龙书练习 4.2.3 f:两半不同的字符串的语法