Newer
Older
#include <ur_kinematics/ur_moveit_plugin.h>
#include <geometry_msgs/PoseStamped.h>
#include <ros/ros.h>
#include <pluginlib/class_list_macros.h>
#include <ur_kinematics/ur_kin.h>
//register URKinematicsPlugin as a KinematicsBase implementation
PLUGINLIB_EXPORT_CLASS(ur_kinematics::URKinematicsPlugin,kinematics::KinematicsBase);
URKinematicsPlugin::URKinematicsPlugin()
: kdl_kinematics_plugin::KDLKinematicsPlugin(), ik_weights_(6) {}
// //URKinematicsPlugin::~URKinematicsPlugin() {}
bool URKinematicsPlugin::searchPositionIK(const geometry_msgs::Pose &ik_pose,
const std::vector<double> &ik_seed_state,
double timeout,
std::vector<double> &solution,
const IKCallbackFn &solution_callback,
moveit_msgs::MoveItErrorCodes &error_code,
const std::vector<double> &consistency_limits,
const kinematics::KinematicsQueryOptions &options) const
{
//double homo_ik_pose[4][4];
KDL::Frame kdl_ik_pose;
tf::poseMsgToKDL(ik_pose, kdl_ik_pose);
double homo_ik_pose[4][4];
kdl_ik_pose.Make4x4((double*) homo_ik_pose);
for(int i=0; i<3; i++) homo_ik_pose[i][3] *= 1000;
double q_ik_sols[8][6];
uint16_t num_sols = inverse((double*) homo_ik_pose, (double*) q_ik_sols, ik_seed_state[5]);
if(num_sols <= 0) {
// NO SOLUTION
error_code.val = error_code.NO_IK_SOLUTION;
return false;
}
double min_weighted_diff = 1e9;
int min_diff_index = -1;
for(uint16_t i=0; i<num_sols; i++) {
double cur_weighted_diff = 0;
for(uint16_t j=0; j<6; j++) {
cur_weighted_diff += ik_weights_[j] * std::fabs(q_ik_sols[i][j] - ik_seed_state[j]);
if(cur_weighted_diff < min_weighted_diff) {
min_weighted_diff = cur_weighted_diff;
min_diff_index = i;
solution.resize(6);
std::copy(q_ik_sols[min_diff_index], q_ik_sols[min_diff_index+1], solution.begin());
if(!solution_callback.empty())
solution_callback(ik_pose,solution,error_code);
else
error_code.val = error_code.SUCCESS;
return true;
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
//
// bool URKinematicsPlugin::getPositionFK(const std::vector<std::string> &link_names,
// const std::vector<double> &joint_angles,
// std::vector<geometry_msgs::Pose> &poses) const
// {
// // double q[6];
// // for(int i=0; i<6; i++)
// // q[i] = joint_angles[i];
// // double T[6][16];
// // forward_all(q, T[0], T[1], T[2], T[3], T[4], T[5]);
// // for(int i=0; i<6; i++) {
// // aa
// // }
// }
//
/**
* @brief Initialization function for the kinematics
* @return True if initialization was successful, false otherwise
*/
bool URKinematicsPlugin::initialize(const std::string& robot_description,
const std::string& group_name,
const std::string& base_frame,
const std::string& tip_frame,
double search_discretization)
{
ros::NodeHandle private_handle("~");
if(private_handle.hasParam("ik_weights")) {
private_handle.getParam("ik_weights", ik_weights_);
} else {
ik_weights_[0] = 1.0;
ik_weights_[1] = 1.0;
ik_weights_[2] = 0.1;
ik_weights_[3] = 0.1;
ik_weights_[4] = 0.3;
ik_weights_[5] = 0.3;
}
return kdl_kinematics_plugin::KDLKinematicsPlugin::initialize(
robot_description, group_name, base_frame, tip_frame, search_discretization);
}
//
// /**
// * @brief Return all the joint names in the order they are used internally
// */
// const std::vector<std::string>& URKinematicsPlugin::getJointNames() const
// {
// return fk_solver_info_.joint_names;
// }
//
// /**
// * @brief Return all the link names in the order they are represented internally
// */
// const std::vector<std::string>& URKinematicsPlugin::getLinkNames() const
// {
// return fk_solver_info_.link_names;
// }