Go to the documentation of this file.00001 #include <gtest/gtest.h>
00002 #include "robodyn_controllers/KdlTreeFk.h"
00003
00004 #include <kdl/treefksolverpos_recursive.hpp>
00005 #include <kdl/chainfksolvervel_recursive.hpp>
00006 #include <ros/package.h>
00007
00008 class KdlTreeFkTest : public ::testing::Test
00009 {
00010 protected:
00011 virtual void SetUp()
00012 {
00013 std::string packagePath = ros::package::getPath("robodyn_controllers");
00014 fk.loadFromFile(packagePath + "/test/urdf/BranchingTestRobot.xml");
00015 tree = fk.getTree();
00016 srand(time(NULL));
00017 }
00018
00019 virtual void TearDown()
00020 {
00021 }
00022
00023 KdlTreeFk fk;
00024 KDL::Tree tree;
00025 };
00026
00027 TEST_F(KdlTreeFkTest, poseTest)
00028 {
00029 KDL::TreeFkSolverPos_recursive kdlSolver(tree);
00030 KDL::JntArray joints(tree.getNrOfJoints());
00031
00032 for (unsigned int i = 0; i < joints.rows(); ++i)
00033 {
00034 joints(i) = ((double)(rand() % 314)) / 100. - 1.57;
00035 }
00036
00037 std::map<std::string, KDL::Frame> frames;
00038 fk.getPoses(joints, frames);
00039
00040 EXPECT_EQ(tree.getSegments().size(), frames.size());
00041
00042 KDL::Frame testFrame;
00043
00044 for (std::map<std::string, KDL::Frame>::const_iterator it = frames.begin(); it != frames.end(); ++it)
00045 {
00046 kdlSolver.JntToCart(joints, testFrame, it->first);
00047 EXPECT_TRUE(Equal(testFrame, it->second));
00048 }
00049 }
00050
00051 TEST_F(KdlTreeFkTest, velTest)
00052 {
00053 KDL::Chain chain;
00054 KDL::JntArrayVel joints(tree.getNrOfJoints());
00055 std::vector<std::string> jointNames;
00056 fk.getJointNames(jointNames);
00057 ASSERT_EQ(joints.q.rows(), jointNames.size());
00058
00059 for (unsigned int i = 0; i < joints.q.rows(); ++i)
00060 {
00061 joints.q(i) = ((double)(rand() % 314)) / 100. - 1.57;
00062 joints.qdot(i) = ((double)(rand() % 200)) / 2000. - .1;
00063 }
00064
00065 std::map<std::string, KDL::FrameVel> frames;
00066 fk.getVelocities(joints, frames);
00067
00068 EXPECT_EQ(tree.getSegments().size(), frames.size());
00069
00070 KDL::FrameVel testFrame;
00071
00072 for (std::map<std::string, KDL::FrameVel>::const_iterator it = frames.begin(); it != frames.end(); ++it)
00073 {
00074
00075 fk.getChain(fk.getBaseName(), it->first, chain);
00076
00077 KDL::ChainFkSolverVel_recursive kdlSolver(chain);
00078
00079 KDL::JntArrayVel chainJoints(chain.getNrOfJoints());
00080 std::vector<std::string> chainJointNames;
00081 fk.getChainJointNames(it->first, chainJointNames);
00082 ASSERT_EQ(chainJoints.q.rows(), chainJointNames.size());
00083
00084 for (unsigned int i = 0; i < chainJoints.q.rows(); ++i)
00085 {
00086 std::vector<std::string>::const_iterator nit = std::find(jointNames.begin(), jointNames.end(), chainJointNames[i]);
00087
00088 if (nit != jointNames.end())
00089 {
00090 chainJoints.q(i) = joints.q(nit - jointNames.begin());
00091 chainJoints.qdot(i) = joints.qdot(nit - jointNames.begin());
00092 }
00093 }
00094
00095 kdlSolver.JntToCart(chainJoints, testFrame);
00096 EXPECT_TRUE(Equal(testFrame, it->second));
00097 }
00098 }
00099
00100 int main(int argc, char** argv)
00101 {
00102 ::testing::InitGoogleTest(&argc, argv);
00103 return RUN_ALL_TESTS();
00104 }