From edb027e8564650760c30295f611e78eca8d09d9e Mon Sep 17 00:00:00 2001 From: ipa-fxm Date: Fri, 6 Mar 2015 15:26:26 +0100 Subject: [PATCH] crop ik solutions wrt joint_limits --- ur10_moveit_config/config/kinematics.yaml | 3 +- ur5_moveit_config/config/kinematics.yaml | 3 +- ur_kinematics/src/ur_moveit_plugin.cpp | 51 +++++++++++++++++++++-- 3 files changed, 49 insertions(+), 8 deletions(-) diff --git a/ur10_moveit_config/config/kinematics.yaml b/ur10_moveit_config/config/kinematics.yaml index c45b66490..e37d336c3 100644 --- a/ur10_moveit_config/config/kinematics.yaml +++ b/ur10_moveit_config/config/kinematics.yaml @@ -1,4 +1,3 @@ -## the UR10KinematicsPlugin only works with the unlimited UR10, i.e. limited:=false #manipulator: # kinematics_solver: ur_kinematics/UR10KinematicsPlugin # kinematics_solver_search_resolution: 0.005 @@ -8,4 +7,4 @@ manipulator: kinematics_solver: kdl_kinematics_plugin/KDLKinematicsPlugin kinematics_solver_search_resolution: 0.005 kinematics_solver_timeout: 0.005 - kinematics_solver_attempts: 3 \ No newline at end of file + kinematics_solver_attempts: 3 diff --git a/ur5_moveit_config/config/kinematics.yaml b/ur5_moveit_config/config/kinematics.yaml index 7b3d7afd7..e2fa9b157 100644 --- a/ur5_moveit_config/config/kinematics.yaml +++ b/ur5_moveit_config/config/kinematics.yaml @@ -1,4 +1,3 @@ -## the UR5KinematicsPlugin only works with the unlimited UR5, i.e. limited:=false #manipulator: # kinematics_solver: ur_kinematics/UR5KinematicsPlugin # kinematics_solver_search_resolution: 0.005 @@ -8,4 +7,4 @@ manipulator: kinematics_solver: kdl_kinematics_plugin/KDLKinematicsPlugin kinematics_solver_search_resolution: 0.005 kinematics_solver_timeout: 0.005 - kinematics_solver_attempts: 3 \ No newline at end of file + kinematics_solver_attempts: 3 diff --git a/ur_kinematics/src/ur_moveit_plugin.cpp b/ur_kinematics/src/ur_moveit_plugin.cpp index 56ca34fb6..160558603 100644 --- a/ur_kinematics/src/ur_moveit_plugin.cpp +++ b/ur_kinematics/src/ur_moveit_plugin.cpp @@ -645,14 +645,57 @@ bool URKinematicsPlugin::searchPositionIK(const geometry_msgs::Pose &ik_pose, // Do the analytic IK num_sols = inverse((double*) homo_ik_pose, (double*) q_ik_sols, jnt_pos_test(ur_joint_inds_start_+5)); + + + uint16_t num_valid_sols; + std::vector< std::vector > q_ik_valid_sols; + for(uint16_t i=0; i valid_solution; + valid_solution.assign(6,0.0); + + for(uint16_t j=0; j<6; j++) + { + if((q_ik_sols[i][j] <= ik_chain_info_.limits[j].max_position) && (q_ik_sols[i][j] >= ik_chain_info_.limits[j].min_position)) + { + valid_solution[j] = q_ik_sols[i][j]; + valid = true; + continue; + } + else if ((q_ik_sols[i][j] > ik_chain_info_.limits[j].max_position) && (q_ik_sols[i][j]-2*M_PI > ik_chain_info_.limits[j].min_position)) + { + valid_solution[j] = q_ik_sols[i][j]-2*M_PI; + valid = true; + continue; + } + else if ((q_ik_sols[i][j] < ik_chain_info_.limits[j].min_position) && (q_ik_sols[i][j]+2*M_PI < ik_chain_info_.limits[j].max_position)) + { + valid_solution[j] = q_ik_sols[i][j]+2*M_PI; + valid = true; + continue; + } + else + { + valid = false; + break; + } + } + + if(valid) + { + q_ik_valid_sols.push_back(valid_solution); + } + } + // use weighted absolute deviations to determine the solution closest the seed state std::vector weighted_diffs; - for(uint16_t i=0; i consistency_limits[ur_joint_inds_start_+j]) { cur_weighted_diff = std::numeric_limits::infinity(); break; @@ -669,7 +712,7 @@ bool URKinematicsPlugin::searchPositionIK(const geometry_msgs::Pose &ik_pose, printf(" q %1.2f, %1.2f, %1.2f, %1.2f, %1.2f, %1.2f\n", ik_seed_state[1], ik_seed_state[2], ik_seed_state[3], ik_seed_state[4], ik_seed_state[5], ik_seed_state[6]); for(uint16_t i=0; i