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
00067 for (unsigned int i = 0; i < actualStateMsg.name.size(); ++i)
00068 {
00069
00070 actualStateMsg.position[i] = 3.1416 * (static_cast<double>(rand() % 10001) / 10000.) - 1.5708;
00071
00072 actualStateMsg.velocity[i] = 2.*(static_cast<double>(rand() % 10001) / 10000.) - 1.;
00073
00074 actualStateMsg.effort[i] = 200.*(static_cast<double>(rand() % 10001) / 10000.) - 100.;
00075
00076
00077 trajStateMsg.effort[i] = 2.*(static_cast<double>(rand() % 10001) / 10000.) - 1.;
00078
00079 trajStateMsg.velocity[i] = actualStateMsg.velocity[i] + trajStateMsg.effort[i] / 30.;
00080
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);
00117
00118 rmt.setJointData(actualStateMsg, trajStateMsg, forceMsg, jd);
00119
00120
00121 id.getAccelInBaseFrame(gravity_kdl, gravity_frame, jd, baseFrame, accelIn);
00122
00123
00124 id.treeRecursiveNewtonEuler(jd, baseFrame, "null", velIn, accelIn, forceOut, inertiaOut);
00125 rmt.getJointCommand(jd, jointTorqueMsg);
00126
00127
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