Mini Cheetah 代码分析(八)基于零空间的任务分级

一、主要公式

二、源代码注释

三、相关原理解释

一、主要公式

二、源代码注释

该功能的实现在文件KinWBC.cpp中的FindConfiguration函数,主要看注释,与公式是能够对应起来的,由第0个任务,也就是接触任务开始进行迭代,最终求出delta_q和qdot。qddot在另外一个文件WBIC.cpp中

#include "KinWBC.hpp"
// #include <Utilities/Utilities_print.h>
#include "PseudoInverse.h"

template <typename T>
KinWBC<T>::KinWBC(size_t num_qdot)
    : threshold_(0.001), num_qdot_(num_qdot), num_act_joint_(num_qdot - 6)
{
  I_mtx = DMat<T>::Identity(num_qdot_, num_qdot_);
}

template <typename T>
bool KinWBC<T>::FindConfiguration(
    const DVec<T> &curr_config, const std::vector<Task<T> *> &task_list,
    const std::vector<ContactSpec<T> *> &contact_list, DVec<T> &jpos_cmd,
    DVec<T> &jvel_cmd) //
{

  // Contact Jacobian Setup // contact任务的雅可比,堆叠成一个大矩阵
  DMat<T> Nc(num_qdot_, num_qdot_); // dotx=Jc*qdot,接触雅可比矩阵,维度为仿真
  std::cout << "num_qdot_:zhhw \n"
            << num_qdot_ << std::endl;
  Nc.setIdentity();
  if (contact_list.size() > 0)
  {
    DMat<T> Jc, Jc_i;
    contact_list[0]->getContactJacobian(Jc);
    size_t num_rows = Jc.rows();

    for (size_t i(1); i < contact_list.size(); ++i)
    {
      contact_list[i]->getContactJacobian(Jc_i);
      size_t num_new_rows = Jc_i.rows();
      Jc.conservativeResize(num_rows + num_new_rows, num_qdot_);
      Jc.block(num_rows, 0, num_new_rows, num_qdot_) = Jc_i; // 添加这个contact任务的雅可比
      num_rows += num_new_rows;
    }

    // Projection Matrix
    _BuildProjectionMatrix(Jc, Nc); // 对应公式20, 构建Jc雅可比矩阵的零空间矩阵Nc
  }

  // First Task
  DVec<T> delta_q, qdot;
  DMat<T> Jt, JtPre, JtPre_pinv, N_nx, N_pre;

  Task<T> *task = task_list[0];
  task->getTaskJacobian(Jt);
  JtPre = Jt * Nc;                   // 对应公式19,由Nc乘以当前任务的雅可比矩阵Jt
  _PseudoInverse(JtPre, JtPre_pinv); // 对应公式16中的系数矩阵

  delta_q = JtPre_pinv * (task->getPosError()); // 对应公式16,delt{q_0}=0
  qdot = JtPre_pinv * (task->getDesVel());

  DVec<T> prev_delta_q = delta_q; // 计算出delt{q_1}
  DVec<T> prev_qdot = qdot;
  // 当前任务计算完成
  //  计算下一层级任务所需的变量,For the next task
  _BuildProjectionMatrix(JtPre, N_nx); // 对应公式20, 构建JPre雅可比矩阵的零空间矩阵N_nx
  N_pre = Nc * N_nx;                   // 对应公式19,第二步,从N0开始,

  for (size_t i(1); i < task_list.size(); ++i) // 从i=1开始迭代
  {
    task = task_list[i];

    task->getTaskJacobian(Jt); // 当前任务的雅可比矩阵Jt
    JtPre = Jt * N_pre;        // 对应公式19,构建JPre

    _PseudoInverse(JtPre, JtPre_pinv); // JtPre矩阵的伪逆
    delta_q =
        prev_delta_q + JtPre_pinv * (task->getPosError() - Jt * prev_delta_q); // 对应公式16,求出速度增量delta_q
    qdot = prev_qdot + JtPre_pinv * (task->getDesVel() - Jt * prev_qdot);      // 对应 公式17,求出下一次迭代的qdot
    // 当前任务计算完成
    //  计算下一层级任务所需的变量,For the next task
    _BuildProjectionMatrix(JtPre, N_nx); // 当前任务的零空间矩阵N_nx
    N_pre *= N_nx;                       // 由最高层级第0个的零空间乘以当前的Npre得到当前的零空间,开始迭代,
    prev_delta_q = delta_q;              // 当前的delta_q用于下一次迭代
    prev_qdot = qdot;                    // 当前的qdot用于下一次迭代
  }
  for (size_t i(0); i < num_act_joint_; ++i)
  {
    jpos_cmd[i] = curr_config[i + 6] + delta_q[i + 6]; // 将数据发送出去
    jvel_cmd[i] = qdot[i + 6];
  }
  return true;
}

template <typename T>
void KinWBC<T>::_BuildProjectionMatrix(const DMat<T> &J, DMat<T> &N)
{
  DMat<T> J_pinv;
  _PseudoInverse(J, J_pinv);
  N = I_mtx - J_pinv * J; // 对应公式20,N=1-(Jc# * Jc)求解零空间
}

template <typename T>
void KinWBC<T>::_PseudoInverse(const DMat<T> J, DMat<T> &Jinv)
{
  pseudoInverse(J, threshold_, Jinv); // 计算矩阵的伪逆矩阵
}

template class KinWBC<float>;
template class KinWBC<double>;

三、相关原理解释

先通过一个简单的例子进行说明

基于零空间方法(NUB)的全身控制(WBC)的简单实现 - 知乎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/628494.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MATLAB】Enigma机加密原理与自实现

文章目录 什么是EnigmaEnigma机加密通信流程Enigma的物理构造Enigma的加密设置Enigma加密通信密码重新设置Enigma加密消息拼接注意 Enigma的解密分解设置Enigma解密通信密码重新设置Enigma解密消息 Enigma的弱点MATLAB自实现Enigma加密与解密Enigma_functionRotate_functiontes…

Scrapy爬虫:利用代理服务器爬取热门网站数据

在当今数字化时代&#xff0c;互联网上充斥着大量宝贵的数据资源&#xff0c;而爬虫技术作为一种高效获取网络数据的方式&#xff0c;受到了广泛的关注和应用。本文将介绍如何使用Scrapy爬虫框架&#xff0c;结合代理服务器&#xff0c;实现对热门网站数据的高效爬取&#xff0…

金价又双叒涨了!现货黄金什么比较好

虽然近期有新闻显示&#xff0c;国内的实物黄金价格出现大幅的下跌&#xff0c;但是从整体看&#xff0c;多个黄金投资品种的长期上升趋势还是比较稳定的&#xff0c;因此我们会看到&#xff0c;很多投资者会趁现在这波下跌重新入场做多。那么投资黄金买什么比较好呢&#xff1…

2024年5月18日(星期六)骑行香杆箐

2024年5月18日 (星期六&#xff09;骑行香杆箐&#xff0c;早8:30到9:00&#xff0c;郊野公园西门集合&#xff0c;9:30准时出发【因迟到者&#xff0c;骑行速度快者&#xff0c;可自行追赶偶遇。】 偶遇地点:郊野公园西门集合 &#xff0c;家住东&#xff0c;西&#xff0c;南…

dvwa靶场 JavaScript Attacks(js攻击)全难度教程(附代码分析)

JS简介 一种解释型语言&#xff08;代码不需要编译&#xff09;&#xff0c;一般镶嵌在html或者php中实现。 JavaScript Attacks&#xff08;Security Level: low&#xff09; 代码分析 <?php $page[ body ] . <<<EOF <script>/* MD5 code from here h…

参赛指南第二弹!9省齐发 详解赛事参与全攻略

一. 大赛介绍 中国机器人及人工智能大赛是由中国人工智能学会、教育部高等学校计算机课程教学指导委员会联合主办。旨在引导和激励广大青年学生弘扬创新精神&#xff0c;搭建良好的科技创新赛事平台&#xff0c;积极推动广大学生参与机器人、人工智能科技创新实践、提高团队协…

动规解决01背包/完全背包精讲

还不会用动态规划解决01背包/完全背包&#xff1f;看这一篇文章就够了&#xff01; 首先我们要明白什么是01背包和完全背包。 背包问题总体问法就是&#xff1a; 你有一个背包&#xff0c;最多能容纳的体积是V。 现在有n个物品&#xff0c;第i个物品的体积为vi​ ,价值为wi​…

Linux|如何允许 awk 使用 Shell 变量

引言 当我们编写 shell 脚本时&#xff0c;我们通常会在脚本中包含其他较小的程序或命令&#xff0c;例如 awk 操作。就 Awk 而言&#xff0c;我们必须找到将一些值从 shell 传递到 Awk 操作的方法。 这可以通过在 Awk 命令中使用 shell 变量来完成&#xff0c;在本文中&#x…

做全域运营赛道,如何避免被割韭菜?

当下&#xff0c;全域运营赛道逐渐成型&#xff0c;许多创业者虽然都有了做全域运营服务商的想法&#xff0c;但却因全域运营是割韭菜等流言而心存疑虑&#xff0c;担心自己上当受骗&#xff0c;赔得血本无归。 事实上&#xff0c;关于全域运营是不是割韭菜这个问题&#xff0c…

Electron自动化测试技术选型调研

Electron简介 Electron是一个开源的框架&#xff0c;用于构建跨平台的桌面应用程序。它由GitHub开发并于2013年首次发布。Electron允许开发人员使用Web技术&#xff08;如HTML、CSS和JavaScript&#xff09;来构建桌面应用程序&#xff0c;同时可以在Windows、macOS和Linux等操…

量子计算机接入欧洲最快超算!芬兰加快混合架构算法开发

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨浪味仙 排版丨沛贤 深度好文&#xff1a;1900字丨7分钟阅读 摘要&#xff1a;芬兰技术研究中心&#xff08;VTT&#xff09;与 CSC 展开合作&#xff0c;基于量子计算机超算架构进行算法开…

Java为什么会成为现在主流的编程语言

Java为什么会成为现在的主流语言 前言一、Java语言概述Java是什么为什么大多数人会选择从事Java为什么从事Java的工作者数量从年递减 二、Java语言的特点简单性面向对象分布式&#xff08;微服务&#xff09;健壮性安全性体系结构中立可移植性解释型高性能多线程动态性 三、Jav…

Linux连接文件那点事

什么是连接文件 将一个文件和另一个文件建立联系&#xff0c;分为硬链接和软连接&#xff08;符号连接&#xff09;。 硬链接 Linux中&#xff0c;所有的文件都有一个inode&#xff0c;这个东西就是文件的ID号&#xff0c;硬链接的方式就是通过这个inode来产生新的文件名来建…

ChatGPT4O:自然语言交互

ChatGPT 4O&#xff1a;引领自然语言处理的新纪元 一、技术细节与强大功能二、创新点与技术突破三、应用场景与商业化前景 在科技的浪潮中&#xff0c;自然语言处理&#xff08;NLP&#xff09;领域一直备受关注。最近&#xff0c;OpenAI公司发布了其最新的NLP模型——ChatGPT …

echarts 环形图实现透明间隔,嵌套环形图片和图形

echarts 环形图实现透明间隔&#xff0c;嵌套环形图片和图形 环形图实现透明间隔环形图嵌套环形图片环形图嵌套环形图形 环形图实现透明间隔 首先通过 radius 属性实现一个圆环图 再通过 padAngle 属性设置扇区角度即可 使用 borderRadius 属性设置扇形区块的内外圆角半径&…

【PDF技巧】PDF如何解密?

PDF文件设置了加密&#xff0c;需要密码才能够打开文件或者编辑文件&#xff0c;那么如何解密PDF密码&#xff1f;今天我们来一起学习一下。 首先是在已知密码的情况下&#xff0c;PDF文件中的打开密码或者是限制编辑&#xff0c;想要解密PDF密码&#xff0c;我们只需要在PDF编…

这些网站我愿称之为做答辩PPT的神

很多快要毕业的同学在做答辩PPT的时候总是感觉毫无思路&#xff0c;一窍不通。但这并不是你们的错&#xff0c;对于平时没接触过相关方面&#xff0c;第一次搞答辩PPT的人来说&#xff0c;这是很正常的一件事。一个好的答辩PPT可以根据以下分为以下几部分来写。 1.研究的背景和…

寒冷地区污水处理一体化设备如何选型

在寒冷地区选择污水处理一体化设备时&#xff0c;需要特别考虑设备的耐寒性能和处理效率&#xff0c;以确保在低温环境下仍能稳定运行并达到预期的处理效果。以下是一些选型时需要考虑的关键因素&#xff1a; 耐寒设计&#xff1a;选择具有耐寒设计的设备&#xff0c;例如&…

【GESP】2023年12月图形化一级 -- 返回地球

返回地球目 1. 准备工作 (1)删除默认小猫角色。 (2)添加角色Cat Flying和Earth。 (3)删除默认白色背景,添加背景Nebula。 2. 功能实现(根据注意事项,用积木块实现下列描述的功能) (1)点击绿旗,角色Earth的初始位置为(X=170,Y=120),并以每秒向右旋转15度的…