为什么80%的码农都做不了架构师?>>>   

// Software License Agreement (BSD License)
//
// Copyright (c) 2017 Svenzva Robotics
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
//
//  * Redistributions of source code must retain the above copyright
//    notice, this list of conditions and the following disclaimer.
//  * Redistributions in binary form must reproduce the above
//    copyright notice, this list of conditions and the following
//    disclaimer in the documentation and/or other materials provided
//    with the distribution.
//  * Neither the name of University of Arizona nor the names of its
//   contributors may be used to endorse or promote products derived
//    from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.#include <kdl_parser/kdl_parser.hpp>
#include <ros/ros.h>
#include <ros/package.h>
#include <stdlib.h>
#include <cmath>#include <kdl/frames.hpp>
#include <kdl/chainfksolverpos_recursive.hpp>
#include <kdl/chainidsolver_recursive_newton_euler.hpp>
#include <kdl/chainiksolvervel_pinv.hpp>#include <sensor_msgs/JointState.h>sensor_msgs::JointState joint_states;
KDL::Tree my_tree;
KDL::Chain chain;
int mNumJnts = 6;
// Get some joint pos, vel, acc values
KDL::JntArray jnt_q(mNumJnts);
KDL::JntArray jnt_qd(mNumJnts);
KDL::JntArray jnt_qdd(mNumJnts);
KDL::JntArray jnt_taugc(mNumJnts);
sensor_msgs::JointState model_states;
bool first_run = true;
KDL::ChainIdSolver_RNE *gcSolver;double alpha = 0.5;void js_cb(const sensor_msgs::JointState::ConstPtr& msg){for(int i = 0; i < msg->effort.size(); i++){joint_states.effort[i] = msg->effort[i] * alpha + (1.0 - alpha) * joint_states.effort[i];}joint_states.position = msg->position;//joint_states = *msg;
}/** tau given q and the system dynamics*/
void feel_efforts(ros::Publisher tau_pub){KDL::Wrenches jnt_wrenches;for (unsigned int i = 0; i < mNumJnts; i++) {jnt_q(i) = joint_states.position[i];jnt_qd(i) = 0.0;jnt_qdd(i) = 0.0;KDL::Wrench wr = KDL::Wrench();if( !first_run) {int gr = 1;/*if(i == 0)gr = 4;else if(i == 3)gr = 3;else if( i == 4)gr = 4;else if(i == 1 || i == 2)gr = 7;*/double diff = model_states.effort[i] - joint_states.effort[i];double frc = 0.0;frc = -1 * (diff) * gr;KDL::Vector force(0, frc, 0);wr.torque = force;jnt_wrenches.push_back(wr);}else{jnt_wrenches.push_back(KDL::Wrench());}}first_run = false;// Compute Dynamics int ret = gcSolver->CartToJnt(jnt_q, jnt_qd, jnt_qdd, jnt_wrenches,jnt_taugc);model_states = joint_states;if (ret < 0){ ROS_ERROR("KDL: inverse dynamics ERROR");ROS_ERROR("%d", ret);}else{int divisor = 1;for( int i = 0; i < mNumJnts; i++){//Compute the error in the model vs present output torquesif( i == 1){//spring function: y= -0.000012159725010x^3 + 0.001933370127203x^2 + 0.002502918014389x + 0.075320089110718double spring_offset = (-0.0001215972501*std::pow(joint_states.position[i], 3)) + (0.0019337012*std::pow(joint_states.position[i], 2)) + (0.0025029181439*joint_states.position[i]) + 0.0753200891107  ;jnt_taugc(i) = jnt_taugc(i) - spring_offset; }if (i == 0)divisor = 10000;if (i == 1 || i == 2)divisor = 7;else if (i == 3)divisor = 3;else if (i == 4)divisor = 4;model_states.effort[i] = jnt_taugc(i) / divisor;}}tau_pub.publish(model_states);
}int main(int argc, char** argv){ros::init(argc, argv, "svenzva_dynamics");ros::NodeHandle n;for(int i = 0; i < 7; i++)joint_states.effort.push_back(0.0);ros::Subscriber js_sub = n.subscribe("joint_states", 1, js_cb);ros::Publisher tau_pub = n.advertise<sensor_msgs::JointState>("/revel/model_efforts/", 1);ros::Rate update_rate = ros::Rate(10);std::string path = ros::package::getPath("svenzva_description");std::string full_path = path + "/robots/svenzva_arm.urdf";ROS_INFO("Loading model from %s", full_path.c_str());kdl_parser::treeFromFile(full_path, my_tree);if (!kdl_parser::treeFromFile(full_path, my_tree)){ROS_ERROR("Failed to construct kdl tree");return false;}my_tree.getChain("base_link", "link_6", chain);ROS_INFO("Kinematic chain expects %d joints", chain.getNrOfJoints());KDL::Vector gravity(0.0, 0.0, -9.81);gcSolver = new KDL::ChainIdSolver_RNE(chain, gravity);/** Publish the expected torque according to the dynamic model*/ros::spinOnce();ros::Duration(5).sleep();update_rate.sleep();while(ros::ok()){ros::spinOnce();feel_efforts(tau_pub);update_rate.sleep();}return 0;}
参考:
https://github.com/SvenzvaRobotics/svenzva_ros/

转载于:https://my.oschina.net/itfanr/blog/1982293

orocos KDL 由位置计算力矩相关推荐

  1. 【MR】现代机器人学算法库---计算力矩控制

    方框图 伪代码 核心代码: //本章的两个功能集中在计算力矩控制器的使用上//计算力矩控制//thetalist :关节位置n维矢量//dthetalist: 关节速率n维矢量// eint: 关节误 ...

  2. RTKLIB学习总结(六)导航电文、卫星位置计算

    文章目录 一.导航电文 1.GNSS卫星信号的组成 2.导航电文的编排 3.遥测字(TLW) 4.交接字(HOW) 5.第一数据块 6.第二数据块 7.第三数据块 二.卫星钟差钟漂改正 1.时钟校正参 ...

  3. C++开发斗地主(QT)第三篇之动画发牌与位置计算

    本篇讲的是是怎样发牌,计算牌的准确位置,请看下面桌面: 发好牌后的样子: 自己家的牌位置很好计算: 假如牌的大小为122*150,数量为n,每张牌的间隔是40,窗口的宽为width(),高为heigh ...

  4. 二十八宿距星位置计算

    该程序适用于其他恒星位置的计算,需要录入基本数据,包括J2000.0的恒星位置.恒星自行等. # 恒星位置计算 import math import ephem# 二十八宿距星数据结构 class S ...

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

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

  6. 卫星位置计算小程序(C#版)

    一.最终画面 二.程序代码 using System; using System.Collections.Generic; using System.ComponentModel; using Sys ...

  7. 卫星位置计算基础讲解

    目录 写在前面 广播星历解读 计算基本原理 源代码及计算结果 总结 写在前面 本篇博文用于充实个人分类专栏"GNSS课程",同时希望能够对有需要的朋友有所帮助. 教材采用<G ...

  8. 四分位数的位置计算原理?

    四分位数的位置计算原理? - 猴子的回答 - 知乎https://www.zhihu.com/question/54858749/answer/202280013

  9. 第 1 章之:下三角矩阵元素存储位置计算

    声明:文章为博主原创,转载请联系博主.文章若有错误和疏漏之处,还望大家不吝赐教!                                                第一章:数据结构与算法基 ...

  10. 基于计算机视觉原理的自主足球机器人位置计算

    1 前言 计算机视觉系统是目前人工智能研究最重要的工具, 也是自主足球机器人的主要研究内容之一. 其内容包括根据一幅或多幅视平面图像计算出视点到目标物体的距离.目标物体的运动参数.以及目标物体的表面特 ...

最新文章

  1. 《Haskell趣学指南》—— 第1章,第1.2节小朋友的第一个函数
  2. nginx 访问控制 防盗链
  3. 脑植入芯片实现脑机交互,脑神经链会如星链般放大马斯克的光环吗
  4. django数据库迁移问题
  5. abovedisplayskip无效_latex公式图片行间距段间距调整心得 -
  6. 让51单片机八段数码管亮起来(静态显示和动态显示、共阴极和共阳极、位码和段码)
  7. vue的一点初级理解
  8. HarmonyOS 组件篇
  9. 数据结构常见算法机试题
  10. jQuery jQuery on()方法
  11. 《遥感原理与应用》总结—遥感图像几何处理
  12. 堰流实验报告思考题_创新实验之一:桥墩冲刷实验
  13. 视频转换器怎么将视频转成GIF动画
  14. 老婆也是程序员,双码农家庭真的快乐吗?
  15. MCE | 线粒体和能量代谢的关系
  16. Php区分自然量跟aso量,ASO优化——判断下载量与评论的比例关系
  17. DarkComet RAT简介
  18. 博客PV突破300万暨两次线上活动圆满结束
  19. 芯片级维修学习课程安排
  20. NAIPC2018-K-Zoning Houses

热门文章

  1. C语言游戏编程之flappy birds
  2. 计算机专业综合改革举措,数学与应用数学专业综合改革的举措.docx
  3. Microsoft FxCop 的设计规则 .
  4. iOS 5 故事板进阶(1)
  5. android6最新版本,安卓版“AirDrop”发布,安卓6版本以上都能用!
  6. 伯爵写给女巫的一封信
  7. 群晖nas介绍文档_我的NAS我的地盘 篇三:群晖NAS软件介绍与应用之DS file篇
  8. 搭建网站服务器必须开443端口,记录解决网站443端口不通的问题(启动HTTP或者更换域名)...
  9. linux系统出现BUG:softlockup- CPU#0 STUCK FOR 23s 或 rcu_sched self-detected stall on cpu 等字样的解决办法
  10. win10兼容模式怎么设置_win10开始菜单没反应怎么办?是因为没有设置这个