方框图

伪代码

核心代码:

//本章的两个功能集中在计算力矩控制器的使用上//计算力矩控制//thetalist :关节位置n维矢量//dthetalist: 关节速率n维矢量// eint: 关节误差的时间积分的 n 维向量//g: 重力矢量//Mlist: 在home位置时连杆坐标系{i}相对于{i−1}位姿矩阵列表。//Glist: 连杆的空间惯量矩阵Gi列表//Slist:空间坐标系中关节的螺旋轴 Si//thetalistd :参考关节变量 θd 的 n 维向量。目标关节位置与当前关节位置非常接近。采用插值轨迹点。//dthetalistd: 参考关节速度的 n 维向量 ˙θd。//ddthetalistd: 参考关节加速度的 n 维向量 ¨θd。//Kp:反馈比例增益(每个关节相同)。//Ki:反馈积分增益(每个关节相同)。//Kd:反馈微分增益(每个关节相同)。//输出:taulist:当前瞬间 由计算力矩控制器 计算的关节力/扭矩的矢量。Eigen::VectorXd ComputedTorque(const Eigen::VectorXd& thetalist, const Eigen::VectorXd& dthetalist, const Eigen::VectorXd& eint,const Eigen::VectorXd& g, const std::vector<Eigen::MatrixXd>& Mlist, const std::vector<Eigen::MatrixXd>& Glist,const Eigen::MatrixXd& Slist, const Eigen::VectorXd& thetalistd, const Eigen::VectorXd& dthetalistd, const Eigen::VectorXd& ddthetalistd,double Kp, double Ki, double Kd) {Eigen::VectorXd e = thetalistd - thetalist;  //位置误差 position errEigen::VectorXd tau_feedforward = MassMatrix(thetalist, Mlist, Glist, Slist)*(Kp*e + Ki * (eint + e) + Kd * (dthetalistd - dthetalist));//前馈计算力/力矩增量 Eigen::VectorXd Ftip = Eigen::VectorXd::Zero(6);//末端不受力Eigen::VectorXd tau_inversedyn = InverseDynamics(thetalist, dthetalist, ddthetalistd, g, Ftip, Mlist, Glist, Slist);//重力补偿 Eigen::VectorXd tau_computed = tau_feedforward + tau_inversedyn;//计算目标力矩return tau_computed;}
// 仿真控制/*thetalist:初始关节变量的n向量。dthetalist:初始关节速度的n向量。g:实际重力矢量 g。Ftipmat :一个 N × 6 矩阵,其中每一行都是 Ftip(k∆t) 形式的向量。(如果没有尖端力,用户应输入零,将使用零矩阵)。Mlist:在初始位置相对于 {i-1} 的连杆坐标系 {i} 的实际列表。Glist:连杆的实际空间惯性矩阵Gi。Slist:空间坐标系中关节的螺旋轴 Si。thetamatd:来自参考轨迹的所需关节变量 θd 的 N × n 矩阵。第一行是初始所需的关节配置,第 N 行是最终所需的关节配置。每行之间的时间是 dt,如下所示。dthetamatd:所需关节速度 ˙θd 的 N × n 矩阵。ddthetamatd:所需关节加速度 ¨θd 的 N × n 矩阵。gtilde:重力矢量的(可能不正确的)模型。Mtildelist:连杆坐标系位置的(可能不正确的)模型。Gtildelist:连杆空间惯性矩阵的(可能不正确的)模型。Kp:反馈比例增益(每个关节相同)。Ki:反馈积分增益(每个关节相同)。Kd:反馈微分增益(每个关节相同)。dt:参考轨迹上各点之间的时间步长 Δt。intRes:此输入必须是大于或等于 1 的整数。intRes 是每个时间步长 Δt 期间的欧拉积分步数。较大的值会导致模拟速度变慢,但积分误差的累积会减少。输出:taumat :控制器命令的关节力/力矩的 N × n 矩阵,其中每行 n 个力/力矩对应一个时间点。thetamat :实际关节变量的 N × n 矩阵,与 目标关节变量thetamatd 进行比较。Plot:实际和期望的关节变量的绘图。*/std::vector<Eigen::MatrixXd> SimulateControl(const Eigen::VectorXd& thetalist, const Eigen::VectorXd& dthetalist, const Eigen::VectorXd& g,const Eigen::MatrixXd& Ftipmat, const std::vector<Eigen::MatrixXd>& Mlist, const std::vector<Eigen::MatrixXd>& Glist,const Eigen::MatrixXd& Slist, const Eigen::MatrixXd& thetamatd, const Eigen::MatrixXd& dthetamatd, const Eigen::MatrixXd& ddthetamatd,const Eigen::VectorXd& gtilde, const std::vector<Eigen::MatrixXd>& Mtildelist, const std::vector<Eigen::MatrixXd>& Gtildelist,double Kp, double Ki, double Kd, double dt, int intRes) {Eigen::MatrixXd FtipmatT = Ftipmat.transpose();// NX6->6XN  Tip端施加的力     一列一个力Eigen::MatrixXd thetamatdT = thetamatd.transpose();//关节轨迹点 dt时刻  Nxn->nXN   一列一个 关节位置n维列向量Eigen::MatrixXd dthetamatdT = dthetamatd.transpose();//一列一个 关节速率n维列向量Eigen::MatrixXd ddthetamatdT = ddthetamatd.transpose();//一列一个 关节加速度n维列向量int m = thetamatdT.rows(); //自由度int n = thetamatdT.cols();//轨迹点数Eigen::VectorXd thetacurrent = thetalist;//当前关节位置Eigen::VectorXd dthetacurrent = dthetalist;//当前目标关节位置Eigen::VectorXd eint = Eigen::VectorXd::Zero(m);//累积关节误差  关节误差的时间积分的 m 维向量Eigen::MatrixXd taumatT = Eigen::MatrixXd::Zero(m, n);//计算力矩控制器计算的控制力Eigen::MatrixXd thetamatT = Eigen::MatrixXd::Zero(m, n);//实际关节位置矩阵,一列一个 关节位置dof=m维向量Eigen::VectorXd taulist;Eigen::VectorXd ddthetalist;for (int i = 0; i < n; ++i) {//遍历所有轨迹点taulist = ComputedTorque(thetacurrent, dthetacurrent, eint, gtilde, Mtildelist, Gtildelist, Slist, thetamatdT.col(i),dthetamatdT.col(i), ddthetamatdT.col(i), Kp, Ki, Kd);//计算关节控制力/力矩for (int j = 0; j < intRes; ++j) {ddthetalist = ForwardDynamics(thetacurrent, dthetacurrent, taulist, g, FtipmatT.col(i), Mlist, Glist, Slist);//计算实际关节加速度EulerStep(thetacurrent, dthetacurrent, ddthetalist, dt / intRes);//更新关节位置和关节速率}taumatT.col(i) = taulist;//记录轨迹点i处的实际控制力/力矩thetamatT.col(i) = thetacurrent;//记录轨迹点dt时刻的实际关节位置eint += dt * (thetamatdT.col(i) - thetacurrent);//更新关节误差的dt累积误差}std::vector<Eigen::MatrixXd> ControlTauTraj_ret;//控制力矩轨迹ControlTauTraj_ret.push_back(taumatT.transpose());//前n行 控制力矩ControlTauTraj_ret.push_back(thetamatT.transpose());//后n行 实际关节位置return ControlTauTraj_ret;}

本书中符号含义:


The End

【MR】现代机器人学算法库---计算力矩控制相关推荐

  1. 国密算法:利用python进行sm3 hash算法,计算hash值,国密算法库gmssl的使用

    本篇介绍利用gmssl算法库中的sm3模块来进行hash值的计算. 一 sm3 hash算法的特点: sm3用于计算一个消息的hash值: 几乎无法被逆向,即通过hash值无法推断出原始消息: sm3 ...

  2. 分布式驱动电动汽车LQR DYC 直接横摆力矩控制 最优 规则扭矩分配控制pid计算纵向扭矩需求

    分布式驱动电动汽车LQR DYC 直接横摆力矩控制 最优 规则扭矩分配控制pid计算纵向扭矩需求, 上层lqr计算 下层最小附着利用率分配 扭矩分配 效果优良 稳定性控制 操纵稳定性 matlab s ...

  3. MR作业的提交监控、输入输出控制及特性使用

    2019独角兽企业重金招聘Python工程师标准>>> MR作业的提交监控.输入输出控制及特性使用 博客分类: hadoop 提交作业并监控 JobClient是用户作业与JobTr ...

  4. 清华大学开源迁移学习算法库:基于PyTorch实现,支持轻松调用已有算法

    机器之心报道 编辑:魔王 作者:清华大学大数据研究中心 近日,清华大学大数据研究中心机器学习研究部开源了一个高效.简洁的迁移学习算法库 Transfer-Learn,并发布了第一个子库--深度领域自适 ...

  5. 清华大学开源迁移学习算法库:基于PyTorch实现已有算法

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:机器之心 AI博士笔记系列推荐 周志华<机器学习> ...

  6. 永磁同步电机力矩控制(二):FOC与DTC

    电机的力矩控制当前存在的两个主要流派是磁场定向控制FOC和直接转矩控制DTC,当然这两种控制的算法从原理上说对所有的交流电机都适用,本文只是讲讲他们用于永磁同步电机控制的异同. FOC: FOC控制理 ...

  7. Matlab机器人工具箱(3-4):五自由度机械臂(计算力矩控制方法与roblocks)

    01 roblocks使用方法 在命令行输入roblocks 打开机器人工具箱的模块库 使用'roblocks'命令打开simulink 机器人模块时提示版本过低的解决办法: ① 打开帮助–选择小齿轮 ...

  8. scikit-learn 支持向量机算法库使用小结

    之前通过一个系列对支持向量机(以下简称SVM)算法的原理做了一个总结,本文从实践的角度对scikit-learn SVM算法库的使用做一个小结.scikit-learn SVM算法库封装了libsvm ...

  9. 技术干货|昇思MindSpore 1.5版本中的亲和算法库——MindSpore Boost

    有过AI网络训练的朋友们都知道,基于深度学习训练的AI收集越多的数据,使用越大的网络进行训练,能得到更好的精度.同时,越多的数据.越大的网络也意味着越大的算力消耗.如果能有一个算法库,在同等算力资源下 ...

最新文章

  1. django 模板里面for循环常用的方法
  2. 解决eclipse中出现Resource is out of sync with the file system问题
  3. CPU的基本结构和功能
  4. [实验教程]网工都要会的IPv6 基础配置
  5. saltstack配置apache
  6. java圆形排列_位图排序java版
  7. 'fopen' This function or variable may be unsafe
  8. Java入门系列-22-IO流
  9. 数据探查_数据科学家,开始使用探查器
  10. mc云服务器配置要求_云服务器 IPV6的配置
  11. Find Any File for Mac(文件搜索软件)
  12. c# winform人脸识别
  13. 基于mysql的报表工具有哪些?值得推荐的mysql报表工具
  14. HEG运行错误:GetBeginAndEndLocs
  15. R语言实战 第2版 中文目录
  16. linux windos 设计理念,Windows 20 概念设计
  17. 体声波(BAW)射频滤波器行业调研报告 - 市场现状分析与发展前景预测
  18. leetcode 算法-乘积最大子序列-152
  19. WPF:MouseDown、MouseUP事件,鼠标按下不起作用
  20. 一段百年征程的有限单群

热门文章

  1. 电子计算机科学之父,电子计算机之父/历史的丰碑
  2. 宝塔虚拟服务器,通过宝塔面板配置虚拟主机(共享服务器)
  3. prometheus的401、403报错处理
  4. Python3-word文档操作(十):利用docx库创建word文档,添加段落,添加表格,添加图片,设置文字粗体,斜体
  5. 小L的算法课堂——博弈论
  6. STM32串口通信-USART全面讲解
  7. 如何在Microsoft Edge中更改主页
  8. 一楼二楼教师办公室图书馆操场计算机房,人教版PEP版四年级下册Unit1-Unit6课前知识预习...
  9. ASP.NET中基于ExtJS的控件Ext.net的使用
  10. 林业大学计算机专业排名2019,2021年北京林业大学最新排名 全国最新排名