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 TaskDVec<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}=0qdot = 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_nxN_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); // 当前任务的雅可比矩阵JtJtPre = 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_qqdot = prev_qdot + JtPre_pinv * (task->getDesVel() - Jt * prev_qdot);      // 对应 公式17,求出下一次迭代的qdot// 当前任务计算完成//  计算下一层级任务所需的变量,For the next task_BuildProjectionMatrix(JtPre, N_nx); // 当前任务的零空间矩阵N_nxN_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)的简单实现 - 知乎

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

基于SSM的“羽毛球馆管理系统”的设计与实现(源码+数据库+文档)

基于SSM的“羽毛球馆管理系统”的设计与实现&#xff08;源码数据库文档) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统结构图 登录界面 后台用户添加 后台用户管理 球场添加 球场…

「前端」性能优化问题总结

前言 本文主要介绍一些前端通用的性能优化方案总结&#xff0c;非写代码阶段的性能优化。 分包 React router V6.4 数据路由新特性 <Route path/xx lazy{async()>{const module await import(./xx)const XX module.defaultreturn{element:(<Suspense fallback…

C++(week3):C语言文件操作

文章目录 (十二) 文件1.流(1)流模型(2)程序员视角的文件(3)缓冲区类型(4)标准流(5)二进制文件 与 文本文件(6)文件流的接口(API) 2.打开/关闭文件(1)fopen(2)fclose(3)示例代码 3.读/写文件(1)fgetc / fputc&#xff1a;读写文本文件&#xff0c;一个字符一个字符地读写(2)fget…

校园防欺凌平台

校园霸凌事件很难被发现&#xff0c;发现者又可能迫于威胁而不敢告发&#xff0c;被霸凌者又因各种原因而选择忍耐&#xff0c;所以&#xff0c;如果能够在发生校园霸凌的时候&#xff0c;做出及时的预警&#xff0c;也许能够拯救挽回无数个家庭。本平台结合防欺凌设备&#xf…

什么是Serverless ?

目录&#xff1a; 1、服务器发展阶段 2、Serverless定义 3、Serverless理解

软件确认测试详细介绍

在软件开发流程中&#xff0c;确认测试是一个至关重要的环节&#xff0c;它确保软件产品满足预定的需求、性能和质量标准。本文将详细介绍软件确认测试的概念、目的、方法、执行步骤以及其在软件开发周期中的重要性。   一、软件确认测试的概念   软件确认测试&#xff0c;…

干货【挑战全网】中电联互联互通协议 最全高德地图充电桩接入指南,流量必火!慧哥开源充电桩平台V2.5.2

分享《一套免费开源充电桩物联网系统&#xff0c;是可以立马拿去商用的&#xff01;》 一、和高德直接互联互通的优势&#xff1a; 1、高德官方直接互联互通&#xff0c;提供给合作商户独立发展自主权&#xff0c;不依赖任何第三方平台; 2、自己控制电站的上线、下线、修改电…

独立静态ISP:互联网连接的新选择

在数字化时代&#xff0c;互联网连接的质量直接影响着我们的工作与生活。随着技术的发展&#xff0c;独立静态ISP&#xff08;Internet Service Provider&#xff0c;互联网服务提供商&#xff09;逐渐成为企业和个人用户关注的焦点。本文将从五个方面探讨独立静态ISP的优势、应…

C语言详解:数组指针

数组指针是指针 int* p[10] 这是指针数组的写法 &#xff0c;因为【】的优先级比*高&#xff0c; 所以为了解决优先级问题&#xff0c;加&#xff08;&#xff09; int(* p)[10]&arr;//数组的地址要存起来 说明p是指针&#xff08;首先与*结合&#xff09;&#xff0c…

国网1376.1主站与采集终端通信协议和国网1376.2集中器本地通信模块接口协议报文解析工具

本文分享一个国网1376.1主站与采集终端通信协议的报文解析工具&#xff0c;同时本报文解析软件也支持国网1376.2集中器本地通信模块接口协议的报文解析。 下载链接: https://pan.baidu.com/s/1ngbBG-yL8ucRWLDflqzEnQ 提取码: y1de 主界面如下图所示&#xff1a; 同时本软件自…

[图解]SysML和EA建模住宅安全系统-03

1 00:00:00,490 --> 00:00:01,180 怎么加 2 00:00:01,570 --> 00:00:04,380 我们来看&#xff0c;这是刚才那个图 3 00:00:05,200 --> 00:00:06,390 17.7 4 00:00:07,150 --> 00:00:08,260 我们同样在这里加 5 00:00:08,430 --> 00:00:10,100 同样在这个下面…

「AIGC算法」近邻算法原理详解

本文主要介绍近邻算法原理及实践demo。 一、原理 K近邻算法&#xff08;K-Nearest Neighbors&#xff0c;简称KNN&#xff09;是一种基于距离的分类算法&#xff0c;其核心思想是距离越近的样本点&#xff0c;其类别越有可能相似。以下是KNN算法的原理详解&#xff1a; 1. 算…

python3.6+pycharm安装配置

python3.6安装 下载python3.6 官网&#xff1a;下载 安装及环境变量配置 等待几分钟安装成功&#xff0c;cmd中输入python后返回版本号&#xff0c;安装成功 环境变量path下能看到自动添加了环境变量 pycharm下载安装 pycharm社区版下载 官网&#xff1a;下载 等待…

SmartEDA在电工电子实验中的神奇应用:解锁实验新境界!

在电工电子的广阔领域中&#xff0c;实验是不可或缺的一部分。它不仅能够验证理论知识的正确性&#xff0c;还能够帮助学生和研究者深入理解电子元件和电路的工作原理。而在这个数字化的时代&#xff0c;一款强大的实验辅助工具——SmartEDA&#xff0c;正悄然改变着电工电子实…

Qt自定义QpushButton分别在c++/python中实现

//.h文件#ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QPainter> #include<QMouseEvent> #include<QPropertyAnimation> #include<QResizeEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; }class Widget : public QWi…

Google Chrome GPU渲染抓包

非安全模式启动 "C:\Program Files\Google\Chrome\Application\chrome.exe" --ignore-certificate-errors --allow-running-insecure-content --disable-web-security 配置环境 set RENDERDOC_HOOK_EGL0 "C:/Program Files/Google/Chrome/Application/chrom…

Python送你小花花

快到520了&#xff0c;准备好送上你的爱意了吗&#xff1f; 还记得去年从网上模仿了一篇python使用turtle画的小花花程序&#xff0c;当时还没有转行到程序员行业&#xff0c;刚刚入门学习编程&#xff0c;还在纠结是学习python、Java还是C#的时候。 总会被一些猎奇的内容吸引&…

国际铝业协会、中铝、百威亚太、海德鲁、诺贝利斯等企业将出席2024第二届中国绿色铝业国际峰会

据中国有色金属工业协会统计数据显示&#xff0c;2022年我国有色行业二氧化碳排放量约为6.6亿吨&#xff0c;其中铝行业二氧化碳排放量为5.5亿吨&#xff0c;占有色金属行业总排放量的83.3%&#xff0c;约占全国总排放量比重的5%&#xff08;2022年中国二氧化碳排放量约为110亿…

企业研发必备网络:这些关键特性,你get了吗?

对于以研发为核心的企业&#xff0c;如软件开发、生物制药、智能汽车等&#xff0c;安全、稳定的研发网络可是他们业务发展不可或缺的。那么&#xff0c;这些研发网络究竟有哪些独特之处&#xff0c;又能为企业带来哪些价值呢&#xff1f; 首先&#xff0c;我们知道企业研发常常…

【十大排序算法】----选择排序(详细图解分析+实现,小白一看就会)

目录 一&#xff1a;选择排序——原理 二&#xff1a;选择排序——分析 三&#xff1a;选择排序——实现 四&#xff1a;选择排序——优化 五&#xff1a;选择排序——效率 一&#xff1a;选择排序——原理 选择排序的原理&#xff1a;通过遍历数组&#xff0c;选出该数组…