test_constraint_aware_kinematics.cpp

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();
}
发布了27 篇原创文章 · 获赞 27 · 访问量 25万+

猜你喜欢

转载自blog.csdn.net/u013164707/article/details/103343431
cpp