drake - 将广义力添加到线性化(或 LQR)MultiBodyPlant 的最佳方法?
问题描述
我正在尝试在从 MultiBodyPlant 线性化的自由浮动系统上添加广义力。对于固定底座,广义力基本上对应于关节扭矩,但对于自由浮动情况,它也包括底座扭矩/力。但是,这些不包括在 MultiBodyPlant 系统的驱动端口中,因此在为线性化(或 LQR)提供驱动端口的同时,基础扳手不包括在线性化后的驱动矩阵 B 中。对于我的工作,我想在线性化中也包括基本扭矩/力。为此,我可以在 drake 中想到 2 种方法,但我不确定在架构上哪个是更好/正确的决定。我计划稍后使用它来制作 TVLQR 控制器以稳定轨迹。
想法1:线性化后更改LQR中的B矩阵:使用LinearQuadraticRegulator(system,context,Q,R,plant_actuation_input_pot())后手动编辑B矩阵
想法2:创建一个LeafSystem类(类似于this),输出端口连接到get_applied_generalized_force_input_port()和输入端口暴露在图表之外(使用ExportOutput()),然后将该系统作为一个整体线性化(包含连接到MultiBodyPlant的CustomLeafSystem)。我假设这样做会将基本驱动添加到线性化系统的 B 矩阵中。
解决方案
实际上这两个想法是我自己会做的。对于您的情况,Idea 1 似乎更易于实现?矩阵 B 将驱动指数映射到广义速度指数。因此,您必须确保将必要的“1”放置在 B 的正确位置。您可以找到自由浮动体索引,使用Body::floating_velocities_start()
它返回完整状态 x 内的起始索引(因此您需要减去 MultibodyPlant: :num_positions() 用于在 B) 中进行索引。对于浮体,广义速度依次是角速度 w_WB 和平移速度 v_WB。因此,广义力对应于在 B 处关于其原点 Bo 施加的扭矩 t_Bo_W 和 f_Bo_W,并在世界坐标系中表示。
推荐阅读
- ios - 缩进表格中的标题
- botframework - 为一位聊天机器人用户使用 Azure Web App 时调整 Azure 聊天机器人的大小
- reactjs - 警告:出于性能原因,此合成事件被重用 JSON,stringify 错误
- sql-server-2008 - 使用 sp_executesql 之类的东西插入多行
- c++ - C++11:我修补了一个段错误,但我不知道是什么修复了它
- reactjs - 在 react-testing-library 中,渲染应该只被调用一次吗?
- python - linux中的Python unicode错误,但不是windows
- typescript - Koa + TypeScript:类型请求上不存在属性'body'
- r - 在R中的数据框中总结1和0的系列
- git - 将 git 暂存文件更新为重命名,而不是删除和新文件