具有依赖于时变 LQR 返回的 K 矩阵的成本函数的非线性系统的直接转录

2024-03-15

我正在致力于实现一种名为 DIRTREL 的轨迹优化算法,该算法本质上是带有附加成本函数的直接转录。然而,成本函数包含通过围绕决策变量 (x, u) 线性化系统并采用离散时变 LQR 获得的 K 矩阵。我的问题是如何在 drake 中最有效、最简洁地表达这一点,因为我当前的方法以符号方式描述系统,并由于 Riccati 差分方程的递归性质而导致极其冗长的符号方程(随着时间步长的增加,长度只会增加),以及这种象征性的做法是否合适。

更多细节:

  1. 将我的系统指定为 LeafSystem
  2. 声明一个包含决策变量 x、u 的数学程序
  3. 要获得随时间变化的线性动力学,请指定一个类,该类在单个时间步长处接收动力学和决策变量,并使用 symbolic.Jacobian(args) 返回该时间步长的雅可比矩阵
  4. 添加包含整个轨迹的成本函数,因此所有 x, u

成本函数内部:

  1. 通过使用接受决策变量并返回雅可比行列式的类,获得每个时间步长的线性化矩阵 A_i、B_i、G_i(G_i 表示噪声)
  2. 使用 A_i 和 B_i 矩阵通过 Riccati 差分方程计算 TVLQR 成本 (S[n]) 并求解 Ks
  3. 返回数学程序的成本,该数学程序本质上是 K 矩阵的大型线性组合

附带说明的是,我不确定以符号方式计算逆的最容易处理的方法,但我最关心的是我的方法以及这种符号描述是否合适。


我认为DIRTREL有几个细节值得讨论:

  1. 成本矩阵S[n]取决于线性化动力学Ai, Bi。我认为在 DIRTREL 中你需要解决一个非线性优化问题,这需要成本的梯度。因此,要计算成本的梯度,您将需要梯度S[n],这需要梯度Ai, Bi. Since Ai and Bi是动力学函数的梯度f(x, u),您将需要计算动力学的二阶梯度。
  2. 我们有一个paper http://groups.csail.mit.edu/robotics-center/public_papers/Dai12a.pdf进行轨迹优化并优化与 LQR 成本相关的成本函数。 DIRTREL 对我们的论文做了一些改进。在我们的实施中,我们处理了S也作为决策变量,所以我们的决策变量是x, u, S,约束包括动力学约束x[n+1] = f(x[n], u[n]),以及 Riccati 方程作为约束S。我认为 DIRTREL 的方法在决策变量较少的情况下可以更好地扩展,但我还没有比较这两种方法之间的数值性能。
  3. 我不知道为什么你需要以符号方式计算逆矩阵。首先,您需要计算的逆是什么?其次,Drake 支持使用自动微分来计算数值梯度。我建议进行数值计算而不是符号计算。由于在数值优化中,您只需要成本/约束的值和梯度,因此以数值方式计算这些值通常比首先推导符号表达式,然后评估符号表达式要高效得多。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有依赖于时变 LQR 返回的 K 矩阵的成本函数的非线性系统的直接转录 的相关文章

  • 使用 iconv 将 UTF8 转换为 UTF16

    当我使用 iconv 从 UTF16 转换为 UTF8 时 一切都很好 但反之亦然 它不起作用 我有这些文件 a 16 strings Little endian UTF 16 Unicode c program text a 8 stri
  • Android-布局的正确定位

    我似乎无法按照我想要的方式正确定位我的布局 我的布局看起来像这样 LinearLayout LinearLayout ListView LinearLayout TextView TextView TextView Button 我的目标是
  • 如何更改全局 .vscode 文件夹的位置?

    我正在 Linux 上设置 Visual Studio Code 由于机器是共享的 我的 HOME文件夹的大小受到限制 没有空间容纳扩展名 存储在 HOME vscode 我尝试安装它们失败了 我在其他开发目录上确实有足够的空间 但我找不到
  • 从 Android 通讯录中删除联系人

    我正在尝试从手机通讯录中删除联系人 该联系人会从手机联系人中删除 但不会从服务器端 Google 联系人 中删除 并且当 Google 联系人同步触发时 已删除的联系人会重新出现 下面是我的代码 public static void del
  • BIRT:无法检索 XML 数据源。 XML 数据源文件无效或该文件不存在

    我创建了一个 XML 数据源 用于从本地应用程序获取 XML 数据 创建数据集时出现以下错误 org eclipse datatools connectivity oda OdaException XML data source canno
  • Python:剥离除数字之外的所有内容

    我必须从几个字符串中的每个字符串中提取一个数字 测量的时间值 我怎样才能优雅地做到这一点 所有数字均为正数 且最多保留两位小数 例如 2 3 40 09 101 4 E 表示法中没有数字 我正在寻找的代码应该执行类似于以下伪代码的操作 gt
  • Swift 中未宣布辅助功能自定义操作

    当我添加accessibilityCustomActions对于一个对象 它在设备上可以正常工作 只要能够上下滑动操作并选择它们 但没有任何公告表明有 可用操作 我应该将其写入accessibilityLabel myself 我认为通过将
  • 如何查明实体框架对象是否已更改?

    我有一个叫做Uczestnik刚刚保存到数据库 var konsultant uczestnik Konsultanci uczestnik Konsultanci null null attached object and reuse i
  • 如何检测仅包含空格的字符串?

    包含一个空格的字符串长度始终等于 1 alert My str length str length 空格是一个字符 所以 str alert My str length str length My str length 3 如何区分空字符串
  • 使用 Dygraphs 绘制图表:根据缩放进行数据采样

    尽管与其他解决方案相比 Dygraphs 的性能非常好 但当查看越来越多的数据点时 性能不可避免地会变慢 我已经在本地加载了所有数据 Dygraphs 有没有办法智能地显示较低的分辨率 就数据点数量而言 然后在缩放时显示更多内容 虽然没有内
  • 同一解决方案中的 MVC 和 Web API 项目

    我不久前创建了一个解决方案 其中包含一个 Web API 2 项目 向移动设备提供 JSON 数据 和一个类库 包括我的数据访问服务 Web API 项目使用 Ninject 进行 DI 一切正常 现在我需要为几个网页添加一个单独的 MVC
  • 如何在 Odoo 12 中使用 Python XML-RPC 注册付款

    首先我创建了这个函数 def invoiceRegisterPayment self register payment row confirm result self ODOO OBJECT execute kw self DATA sel
  • 如何设置SBT的默认项目

    假设我有一个包含三个项目的构建 A B 和 C 如果我当前处于 A 的上下文中并重新加载构建 则重新加载后可能会将上下文更改为 C 因此 每次重新加载后我都必须更改项目上下文 有没有办法将特定项目设置为默认上下文 SBT 选择第一个词法项目
  • 来自服务器的错误:拨打后端时出错:拨打 tcp 10.9.84.149:10250: getsockopt: 连接被拒绝

    我有一个包含三个节点的 kubernetes 集群 10 9 84 149 10 9 105 90 and 10 9 84 149 当我的应用程序尝试在某个 pod 内执行命令时 kuebctl exec it
  • 使用 powershell 合并两个相似但两列不同的表

    我需要连接在 Powershell 中创建的两个表 问题在于 在它们共享的 5 列中 每个表中有两列不同 我怎样才能连接这两个表 然后能够对它们进行排序 我猜我会让两个人做以下事情 例子 表格1 列 a b c d e 表2 a x c d

随机推荐