TreeIdBenchmark.cpp
Go to the documentation of this file.
00001 #include <iostream>
00002 
00003 #include <hayai/hayai.hpp>
00004 
00005 #include "robodyn_controllers/RosMsgTreeId.h"
00006 #include "robodyn_controllers/KdlTreeId.h"
00007 #include "robodyn_controllers/JointDynamicsData.h"
00008 #include <ros/package.h>
00009 
00010 #include <kdl/treefksolverpos_recursive.hpp>
00011 
00012 
00013 class TreeIdBenchmark : public hayai::Fixture
00014 {
00015 protected:
00016     virtual void SetUp()
00017     {
00018         ros::Time::init();
00019 
00020         std::string packagePath = ros::package::getPath("robodyn_controllers");
00021         id.loadFromFile(packagePath + "/test/urdf/r2c_full_body_dynamics.urdf.xml");
00022 
00023         baseFrame = "/r2/right_leg/gripper/tip";
00024 
00025         jd.InitializeMaps(id.getTree());
00026 
00027         actualStateMsg.name.push_back("/r2/left_leg/joint0");
00028         actualStateMsg.name.push_back("/r2/left_leg/joint1");
00029         actualStateMsg.name.push_back("/r2/left_leg/joint2");
00030         actualStateMsg.name.push_back("/r2/left_leg/joint3");
00031         actualStateMsg.name.push_back("/r2/left_leg/joint4");
00032         actualStateMsg.name.push_back("/r2/left_leg/joint5");
00033         actualStateMsg.name.push_back("/r2/left_leg/joint6");
00034         actualStateMsg.name.push_back("/r2/right_leg/joint0");
00035         actualStateMsg.name.push_back("/r2/right_leg/joint1");
00036         actualStateMsg.name.push_back("/r2/right_leg/joint2");
00037         actualStateMsg.name.push_back("/r2/right_leg/joint3");
00038         actualStateMsg.name.push_back("/r2/right_leg/joint4");
00039         actualStateMsg.name.push_back("/r2/right_leg/joint5");
00040         actualStateMsg.name.push_back("/r2/right_leg/joint6");
00041         actualStateMsg.name.push_back("/r2/waist/joint0");
00042         actualStateMsg.name.push_back("/r2/left_arm/joint0");
00043         actualStateMsg.name.push_back("/r2/left_arm/joint1");
00044         actualStateMsg.name.push_back("/r2/left_arm/joint2");
00045         actualStateMsg.name.push_back("/r2/left_arm/joint3");
00046         actualStateMsg.name.push_back("/r2/left_arm/joint4");
00047         actualStateMsg.name.push_back("/r2/left_arm/joint5");
00048         actualStateMsg.name.push_back("/r2/left_arm/joint6");
00049         actualStateMsg.name.push_back("/r2/right_arm/joint0");
00050         actualStateMsg.name.push_back("/r2/right_arm/joint1");
00051         actualStateMsg.name.push_back("/r2/right_arm/joint2");
00052         actualStateMsg.name.push_back("/r2/right_arm/joint3");
00053         actualStateMsg.name.push_back("/r2/right_arm/joint4");
00054         actualStateMsg.name.push_back("/r2/right_arm/joint5");
00055         actualStateMsg.name.push_back("/r2/right_arm/joint6");
00056 
00057         actualStateMsg.position.resize(actualStateMsg.name.size(), 0.);
00058         actualStateMsg.velocity.resize(actualStateMsg.name.size(), 0.);
00059         actualStateMsg.effort.resize(actualStateMsg.name.size(), 0.);
00060 
00061         trajStateMsg.name = actualStateMsg.name;
00062         trajStateMsg.position.resize(trajStateMsg.name.size(), 0.);
00063         trajStateMsg.velocity.resize(trajStateMsg.name.size(), 0.);
00064         trajStateMsg.effort.resize(trajStateMsg.name.size(), 0.);
00065 
00066         // add some random data
00067         for (unsigned int i = 0; i < actualStateMsg.name.size(); ++i)
00068         {
00069             // position between -90 and 90 deg
00070             actualStateMsg.position[i] = 3.1416 * (static_cast<double>(rand() % 10001) / 10000.) - 1.5708;
00071             // velocity between -1 and 1 rad/s
00072             actualStateMsg.velocity[i] = 2.*(static_cast<double>(rand() % 10001) / 10000.) - 1.;
00073             // effort between -100 and 100 N/m
00074             actualStateMsg.effort[i]   = 200.*(static_cast<double>(rand() % 10001) / 10000.) - 100.;
00075 
00076             // acceleration between -1 and 1 rad/s^2
00077             trajStateMsg.effort[i]     = 2.*(static_cast<double>(rand() % 10001) / 10000.) - 1.;
00078             // velocity based on actual and acceleration and rate of 30Hz
00079             trajStateMsg.velocity[i]   = actualStateMsg.velocity[i] + trajStateMsg.effort[i] / 30.;
00080             // position based on actual and velocity and rate of 30Hz
00081             trajStateMsg.position[i]   = actualStateMsg.position[i] + trajStateMsg.velocity[i] / 30.;
00082         }
00083 
00084         gravity_kdl   = KDL::Vector(0, 0, -9.81);
00085         gravity_frame = "/r2/imu";
00086     }
00087 
00088     virtual void TearDown()
00089     {
00090     }
00091 
00092     KdlTreeId   id;
00093     std::string baseFrame;
00094 
00095     RosMsgTreeId                     rmt;
00096     sensor_msgs::JointState          actualStateMsg;
00097     sensor_msgs::JointState          trajStateMsg;
00098     r2_msgs::WrenchState forceMsg;
00099     JointDynamicsData                jd;
00100 
00101     KDL::Vector gravity_kdl;
00102     std::string gravity_frame;
00103 
00104     KDL::Twist            velIn, accelIn;
00105     KDL::Wrench           forceOut;
00106     KDL::RigidBodyInertia inertiaOut;
00107 
00108     sensor_msgs::JointState          jointTorqueMsg;
00109     sensor_msgs::JointState          jointInertiaMsg;
00110     r2_msgs::WrenchState segForceMsg;
00111 };
00112 
00113 BENCHMARK_F(TreeIdBenchmark, IntegratedTest, 3, 1000)
00114 {
00115     id.isBaseFrameInTree(baseFrame);
00116     id.isBaseFrameInTree(baseFrame); // run twice in update hook
00117 
00118     rmt.setJointData(actualStateMsg, trajStateMsg, forceMsg, jd);
00119 
00120     // Find gravity vector and do dynamics
00121     id.getAccelInBaseFrame(gravity_kdl, gravity_frame, jd, baseFrame, accelIn);
00122 
00123     // Gravity Comp
00124     id.treeRecursiveNewtonEuler(jd, baseFrame, "null", velIn, accelIn, forceOut, inertiaOut);
00125     rmt.getJointCommand(jd, jointTorqueMsg);
00126 
00127     // Inertia and force happens regardless
00128     rmt.getJointInertias(jd, jointInertiaMsg);
00129     rmt.getSegmentForces(jd, segForceMsg);
00130 }
00131 
00132 int main(int argc, char** argv)
00133 {
00134     hayai::Benchmarker::RunAllTests();
00135     return 0;
00136 }
00137 


robodyn_controllers
Author(s):
autogenerated on Sat Jun 8 2019 20:20:53