constraint_aware_test.launch
<launch>
<!-- send pr2 urdf to param server -->
<include file="$(find pr2_description)/robots/upload_pr2.launch" />
<test test-name="pr2_kinematics_constraint_aware_test" pkg="pr2_moveit_tests" type="pr2_constraint_aware_kinematics_test" name="right_arm_kinematics" time-limit="180" args = "gdb --ex run --args">
<param name="tip_name" value="r_wrist_roll_link" />
<param name="root_name" value="torso_lift_link" />
<param name="number_ik_tests" value="1000" />
<param name="acceptable_success_percentage" value="90" />
<rosparam command="load" file="$(find pr2_moveit_config)/config/kinematics.yaml"/>
</test>
</launch>
test_constraint_aware_kinematics.cpp
#include <ros/ros.h>
#include <gtest/gtest.h>
#include <pluginlib/class_loader.hpp>
// MoveIt!
#include <moveit/kinematics_constraint_aware/kinematics_constraint_aware.h>
#include <moveit/robot_model/robot_model.h>
#include <moveit/robot_state/robot_state.h>
#include <moveit/robot_state/joint_state_group.h>
#include <moveit/planning_scene/planning_scene.h>
#include <moveit/rdf_loader/rdf_loader.h>
#include <moveit/robot_model_loader/robot_model_loader.h>
#include <eigen_conversions/eigen_msg.h>
#include <urdf/model.h>
#include <srdfdom/model.h>
TEST(ConstraintAwareKinematics, getIK)
{
std::string group_name = "right_arm";
std::string ik_link_name = "r_wrist_roll_link";
ROS_INFO("Initializing IK solver");
planning_scene::PlanningScenePtr planning_scene;
robot_model_loader::RobotModelLoader robot_model_loader("robot_description"); /** Used to load the robot model */
robot_model::RobotModelPtr kinematic_model = robot_model_loader.getModel();
const srdf::ModelSharedPtr& srdf = robot_model_loader.getSRDF();
const urdf::ModelInterfaceSharedPtr& urdf_model = robot_model_loader.getURDF();
planning_scene.reset(new planning_scene::PlanningScene(kinematic_model));
const robot_model::JointModelGroup* joint_model_group = kinematic_model->getJointModelGroup(group_name);
robot_state::RobotStatePtr kinematic_state(new robot_state::RobotState(kinematic_model));
robot_state::JointStateGroup* joint_state_group = kinematic_state->getJointStateGroup(group_name);
kinematic_state->setToDefaultValues();
kinematics_constraint_aware::KinematicsConstraintAware solver(kinematic_model, "right_arm");
ros::NodeHandle nh("~");
int number_ik_tests;
nh.param("number_ik_tests", number_ik_tests, 1);
int acceptable_success_percentage;
nh.param("accepatable_success_percentage", acceptable_success_percentage, 95);
unsigned int num_success = 0;
kinematics_constraint_aware::KinematicsRequest kinematics_request;
kinematics_constraint_aware::KinematicsResponse kinematics_response;
kinematics_response.solution_.reset(new robot_state::RobotState(planning_scene->getCurrentState()));
kinematics_request.group_name_ = group_name;
kinematics_request.timeout_ = ros::Duration(5.0);
kinematics_request.check_for_collisions_ = false;
kinematics_request.robot_state_ = kinematic_state;
geometry_msgs::PoseStamped goal;
goal.header.frame_id = kinematic_model->getModelFrame();
for(std::size_t i = 0; i < (unsigned int) number_ik_tests; ++i)
{
joint_state_group->setToRandomValues();
const Eigen::Affine3d &end_effector_state = joint_state_group->getRobotState()->getLinkState(ik_link_name)->getGlobalLinkTransform();
Eigen::Quaterniond quat(end_effector_state.rotation());
Eigen::Vector3d point(end_effector_state.translation());
goal.pose.position.x = point.x();
goal.pose.position.y = point.y();
goal.pose.position.z = point.z();
goal.pose.orientation.x = quat.x();
goal.pose.orientation.y = quat.y();
goal.pose.orientation.z = quat.z();
goal.pose.orientation.w = quat.w();
joint_state_group->setToRandomValues();
kinematics_request.pose_stamped_vector_.clear();
kinematics_request.pose_stamped_vector_.push_back(goal);
ros::WallTime start = ros::WallTime::now();
if(solver.getIK(planning_scene, kinematics_request, kinematics_response))
num_success++;
else
printf("Failed in %f\n", (ros::WallTime::now()-start).toSec());
}
bool test_success = (((double)num_success)/number_ik_tests > acceptable_success_percentage/100.0);
printf("success ratio: %d of %d", num_success, number_ik_tests);
EXPECT_TRUE(test_success);
}
int main(int argc, char **argv)
{
testing::InitGoogleTest(&argc, argv);
ros::init (argc, argv, "right_arm_kinematics");
return RUN_ALL_TESTS();
}