41 #include <kdl/chainjnttojacsolver.hpp>
42 #include <kdl/chainjnttojacdotsolver.hpp>
43 #include <kdl/tree.hpp>
57 ROS_ERROR(
"Could not initialize tree object");
60 auto root_model = link_models[0]->getName();
62 if (!tree.getChain(root_model, tip_link, kdl_chain))
64 ROS_ERROR_STREAM(
"Could not establish chain from base " << root_model <<
" to tip " << tip_link);
69 KDL::JntArrayVel setupKdlJntArrayVel(
const std::vector<double>& q,
const std::vector<double>& q_dot)
71 KDL::JntArray kdl_jnt_array(q.size());
72 kdl_jnt_array.data = Eigen::VectorXd::Map(q.data(), q.size());
74 KDL::JntArray kdl_jnt_array_qdot(q_dot.size());
75 kdl_jnt_array_qdot.data = Eigen::VectorXd::Map(q_dot.data(), q_dot.size());
77 KDL::JntArrayVel kdl_jnt_array_vel;
78 kdl_jnt_array_vel.q = kdl_jnt_array;
79 kdl_jnt_array_vel.qdot = kdl_jnt_array_qdot;
80 return kdl_jnt_array_vel;
83 Eigen::MatrixXd calculateJacobianDerivativeKDL(
const std::vector<double>& q,
const std::vector<double>& q_dot,
86 KDL::Chain kdl_chain = setupKdlChain(
robot_model, tip_link);
88 KDL::JntArrayVel kdl_jnt_array_vel = setupKdlJntArrayVel(q, q_dot);
90 KDL::ChainJntToJacDotSolver kdl_jacobian_dot_solver(kdl_chain);
91 KDL::Jacobian kdl_jacobian_dot(kdl_chain.getNrOfJoints());
93 kdl_jacobian_dot_solver.JntToJacDot(kdl_jnt_array_vel, kdl_jacobian_dot);
95 return kdl_jacobian_dot.data;
98 Eigen::MatrixXd calculateNumericalJDot(
const RobotStatePtr&
robot_state,
const LinkModel* link_model,
100 const std::vector<double>& q,
const std::vector<double>& qdot,
104 Eigen::MatrixXd jac, jac_plus_dt;
110 robot_state->getJacobian(jmg, link_model, reference_point_position, jac);
113 for (
unsigned int i = 0; i < q.size(); i++)
114 q_plus_dt[i] += dt * qdot[i];
116 robot_state->setJointGroupPositions(jmg, q_plus_dt);
119 robot_state->getJacobian(jmg, link_model, reference_point_position, jac_plus_dt);
120 return (jac_plus_dt - jac) / dt;
130 builder.
addChain(
"a->b",
"revolute", {}, urdf::Vector3(0, 0, 1));
131 builder.
addChain(
"b->c",
"prismatic", {}, urdf::Vector3(1, 0, 0));
132 builder.
addChain(
"c->d",
"revolute", {}, urdf::Vector3(0, 0, 1));
133 builder.
addChain(
"d->e",
"prismatic", {}, urdf::Vector3(1, 0, 0));
135 robot_model_ = builder.
build();
136 robot_state_ = std::make_shared<RobotState>(robot_model_);
150 std::cout <<
"Testing SimpleRobotJacobianDerivative\n";
153 Eigen::MatrixXd moveit_jacobian, moveit_jacobian_derivative;
154 auto joint_model_group = robot_model_->getJointModelGroup(
"group");
157 std::vector<double> test_q{ 0.72552, 0.11599, 0.99237, 0.24576 };
158 std::vector<double> test_qdot{ 0.31079, 0.56458, 0.60189, 0.12969 };
161 robot_state_->setJointGroupPositions(joint_model_group, test_q);
162 robot_state_->setJointGroupVelocities(joint_model_group, test_qdot);
163 robot_state_->updateLinkTransforms();
166 robot_state_->getJacobianDerivative(joint_model_group, robot_state_->getLinkModel(
"e"), reference_point_position,
167 moveit_jacobian, moveit_jacobian_derivative);
170 Eigen::MatrixXd kdl_jacobian_derivative = calculateJacobianDerivativeKDL(test_q, test_qdot, *robot_model_,
"e");
173 std::cout <<
"MoveIt Jacobian Derivative\n" << moveit_jacobian_derivative <<
"\n\n";
174 std::cout <<
"KDL Jacobian Derivative\n" << kdl_jacobian_derivative <<
"\n\n";
180 #ifndef INSTANTIATE_TEST_SUITE_P
184 #define _STATIC static
193 jmg_ = robot_model_->getJointModelGroup(
"panda_arm");
198 robot_model_.reset();
206 robot_state_ = std::make_shared<RobotState>(robot_model_);
228 ROS_WARN(
"Testing PandaRobotJacobianDerivative");
230 Eigen::MatrixXd moveit_jacobian, moveit_jacobian_derivative;
233 std::vector<double> test_q{ 0.32640, 0.82863, 0.99677, 0.54311, 0.76774, 0.82150, 0.06884 };
234 std::vector<double> test_qdot{ 0.29751, 0.76376, 0.70464, 0.38797, 0.63743, 0.20855, 0.72211 };
237 robot_state_->setJointGroupPositions(jmg_, test_q);
238 robot_state_->setJointGroupVelocities(jmg_, test_qdot);
239 robot_state_->updateLinkTransforms();
242 robot_state_->getJacobianDerivative(jmg_, robot_model_->getLinkModel(
"panda_link8"), reference_point_position,
243 moveit_jacobian, moveit_jacobian_derivative);
245 Eigen::MatrixXd kdl_jacobian_derivative =
246 calculateJacobianDerivativeKDL(test_q, test_qdot, *robot_model_,
"panda_link8");
249 std::cout <<
"MoveIt Jacobian Derivative\n" << moveit_jacobian_derivative <<
"\n\n";
250 std::cout <<
"KDL Jacobian Derivative\n" << kdl_jacobian_derivative <<
"\n\n";
257 ROS_WARN(
"Testing testPandaRobotMidLinkJacobianDerivative");
259 Eigen::MatrixXd moveit_jacobian, moveit_jacobian_derivative;
260 std::string link =
"panda_link5";
262 std::vector<double> test_q{ 0.32640, 0.82863, 0.99677, 0.54311, 0.76774, 0.82150, 0.06884 };
263 std::vector<double> test_qdot{ 0.29751, 0.76376, 0.70464, 0.38797, 0.63743, 0.20855, 0.72211 };
266 robot_state_->setJointGroupPositions(jmg_, test_q);
267 robot_state_->setJointGroupVelocities(jmg_, test_qdot);
268 robot_state_->updateLinkTransforms();
271 robot_state_->getJacobianDerivative(jmg_, robot_model_->getLinkModel(link), reference_point_position, moveit_jacobian,
272 moveit_jacobian_derivative);
275 Eigen::MatrixXd numerical_jdot = calculateNumericalJDot(robot_state_, robot_model_->getLinkModel(link), jmg_,
276 reference_point_position, test_q, test_qdot);
279 std::cout <<
"MoveIt Jacobian Derivative\n" << moveit_jacobian_derivative <<
"\n\n";
280 std::cout <<
"Numerical Jacobian Derivative\n" << numerical_jdot <<
"\n\n";
287 ROS_WARN(
"Testing testPandaRobotRefPointJacobianDerivative");
289 Eigen::MatrixXd moveit_jacobian, moveit_jacobian_derivative;
290 std::string link =
"panda_link8";
292 std::vector<double> test_q{ 0.32640, 0.82863, 0.99677, 0.54311, 0.76774, 0.82150, 0.06884 };
293 std::vector<double> test_qdot{ 0.29751, 0.76376, 0.70464, 0.38797, 0.63743, 0.20855, 0.72211 };
296 robot_state_->setJointGroupPositions(jmg_, test_q);
297 robot_state_->setJointGroupVelocities(jmg_, test_qdot);
298 robot_state_->updateLinkTransforms();
301 robot_state_->getJacobianDerivative(jmg_, robot_model_->getLinkModel(link), reference_point_position, moveit_jacobian,
302 moveit_jacobian_derivative);
305 Eigen::MatrixXd numerical_jdot = calculateNumericalJDot(robot_state_, robot_model_->getLinkModel(link), jmg_,
306 reference_point_position, test_q, test_qdot);
309 std::cout <<
"MoveIt Jacobian Derivative\n" << moveit_jacobian_derivative <<
"\n\n";
310 std::cout <<
"Numerical Jacobian Derivative\n" << numerical_jdot <<
"\n\n";
315 int main(
int argc,
char** argv)
317 testing::InitGoogleTest(&argc, argv);
318 ros::init(argc, argv,
"test_jacobian_derivative");
319 return RUN_ALL_TESTS();