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
00060 fk.getChain(fk.getBaseName(), ps.name[i], chain);
00061
00062 KDL::ChainFkSolverVel_recursive kdlSolver(chain);
00063
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
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
00106 fk.getChain(fk.getBaseName(), ps.name[i], chain);
00107
00108 KDL::ChainFkSolverVel_recursive kdlSolver(chain);
00109
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 }