RosMsgTreeFkTest.cpp
Go to the documentation of this file.
00001 #include <gtest/gtest.h>
00002 #include "robodyn_controllers/RosMsgTreeFk.h"
00003 
00004 #include <kdl/treefksolverpos_recursive.hpp>
00005 #include <kdl/chainfksolvervel_recursive.hpp>
00006 #include <ros/package.h>
00007 #include <sensor_msgs/JointState.h>
00008 #include <r2_msgs/PoseState.h>
00009 #include <tf_conversions/tf_kdl.h>
00010 #include <ros/init.h>
00011 
00012 class RosMsgTreeFkTest : public ::testing::Test
00013 {
00014 protected:
00015     virtual void SetUp()
00016     {
00017         std::string packagePath = ros::package::getPath("robodyn_controllers");
00018         fk.loadFromFile(packagePath + "/test/urdf/BranchingTestRobot.xml");
00019         tree = fk.getTree();
00020         srand(time(NULL));
00021         ros::Time::init();
00022     }
00023 
00024     virtual void TearDown()
00025     {
00026     }
00027 
00028     RosMsgTreeFk                   fk;
00029     KDL::Tree                      tree;
00030     sensor_msgs::JointState        js;
00031     r2_msgs::PoseState ps;
00032 };
00033 
00034 TEST_F(RosMsgTreeFkTest, velTest)
00035 {
00036     KDL::Chain chain;
00037     fk.getJointNames(js.name);
00038     js.position.resize(js.name.size(), 0.);
00039     js.velocity.resize(js.name.size(), 0.);
00040     js.effort.resize(js.name.size(), 0.);
00041     js.header.stamp = ros::Time::now();
00042 
00043     for (unsigned int i = 0; i < js.name.size(); ++i)
00044     {
00045         js.position[i] = ((double)(rand() % 314)) / 100. - 1.57;
00046         js.velocity[i] = ((double)(rand() % 200)) / 2000. - .1;
00047     }
00048 
00049     fk.getPoseState(js, ps);
00050     ASSERT_EQ(ps.name.size(), ps.positions.size());
00051     ASSERT_EQ(ps.name.size(), ps.velocities.size());
00052     ASSERT_EQ(ps.name.size(), ps.accelerations.size());
00053 
00054     KDL::FrameVel testFrame;
00055     std::map<std::string, KDL::Twist> vels;
00056 
00057     for (unsigned int i = 0; i < ps.name.size(); ++i)
00058     {
00059         // get chain
00060         fk.getChain(fk.getBaseName(), ps.name[i], chain);
00061         // make solver
00062         KDL::ChainFkSolverVel_recursive kdlSolver(chain);
00063         // get joints
00064         KDL::JntArrayVel chainJoints(chain.getNrOfJoints());
00065         std::vector<std::string> chainJointNames;
00066         fk.getChainJointNames(ps.name[i], chainJointNames);
00067         ASSERT_EQ(chainJoints.q.rows(), chainJointNames.size());
00068 
00069         for (unsigned int j = 0; j < chainJointNames.size(); ++j)
00070         {
00071             std::vector<std::string>::const_iterator nit = std::find(js.name.begin(), js.name.end(), chainJointNames[j]);
00072 
00073             if (nit != js.name.end())
00074             {
00075                 chainJoints.q(j) = js.position[nit - js.name.begin()];
00076                 chainJoints.qdot(j) = js.velocity[nit - js.name.begin()];
00077             }
00078         }
00079 
00080         kdlSolver.JntToCart(chainJoints, testFrame);
00081         KDL::Frame cmpFrame;
00082         tf::poseMsgToKDL(ps.positions[i], cmpFrame);
00083         EXPECT_EQ(testFrame.GetFrame(), cmpFrame);
00084         KDL::Twist cmpTwist;
00085         tf::twistMsgToKDL(ps.velocities[i], cmpTwist);
00086         EXPECT_EQ(testFrame.GetTwist(), cmpTwist);
00087         vels[ps.name[i]] = testFrame.GetTwist();
00088         tf::twistMsgToKDL(ps.accelerations[i], cmpTwist);
00089         EXPECT_EQ(KDL::Twist::Zero(), cmpTwist);
00090     }
00091 
00092     // do it again to check accelerations
00093     js.velocity[0]     += 0.05;
00094     ros::Time prevTime = js.header.stamp;
00095     js.header.stamp    = ros::Time::now();
00096     fk.getPoseState(js, ps);
00097     ASSERT_EQ(ps.name.size(), ps.positions.size());
00098     ASSERT_EQ(ps.name.size(), ps.velocities.size());
00099     ASSERT_EQ(ps.name.size(), ps.accelerations.size());
00100 
00101     ros::Duration elapsedTime = js.header.stamp - prevTime;
00102 
00103     for (unsigned int i = 0; i < ps.name.size(); ++i)
00104     {
00105         // get chain
00106         fk.getChain(fk.getBaseName(), ps.name[i], chain);
00107         // make solver
00108         KDL::ChainFkSolverVel_recursive kdlSolver(chain);
00109         // get joints
00110         KDL::JntArrayVel chainJoints(chain.getNrOfJoints());
00111         std::vector<std::string> chainJointNames;
00112         fk.getChainJointNames(ps.name[i], chainJointNames);
00113         ASSERT_EQ(chainJoints.q.rows(), chainJointNames.size());
00114 
00115         for (unsigned int j = 0; j < chainJointNames.size(); ++j)
00116         {
00117             std::vector<std::string>::const_iterator nit = std::find(js.name.begin(), js.name.end(), chainJointNames[j]);
00118 
00119             if (nit != js.name.end())
00120             {
00121                 chainJoints.q(j)    = js.position[nit - js.name.begin()];
00122                 chainJoints.qdot(j) = js.velocity[nit - js.name.begin()];
00123             }
00124         }
00125 
00126         kdlSolver.JntToCart(chainJoints, testFrame);
00127         KDL::Frame cmpFrame;
00128         tf::poseMsgToKDL(ps.positions[i], cmpFrame);
00129         EXPECT_EQ(testFrame.GetFrame(), cmpFrame);
00130         KDL::Twist cmpTwist;
00131         tf::twistMsgToKDL(ps.velocities[i], cmpTwist);
00132         EXPECT_EQ(testFrame.GetTwist(), cmpTwist);
00133         tf::twistMsgToKDL(ps.accelerations[i], cmpTwist);
00134         ASSERT_NE(0., elapsedTime.toSec());
00135         EXPECT_EQ((testFrame.GetTwist() - vels[ps.name[i]]) / elapsedTime.toSec(), cmpTwist);
00136     }
00137 }
00138 
00139 int main(int argc, char** argv)
00140 {
00141     ::testing::InitGoogleTest(&argc, argv);
00142     return RUN_ALL_TESTS();
00143 }


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