Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00037 #ifndef CHOMP_ROBOT_MODEL_H_
00038 #define CHOMP_ROBOT_MODEL_H_
00039
00040 #include <planning_environment/models/collision_models.h>
00041 #include <collision_proximity_planner/treefksolverjointposaxis.hpp>
00042 #include <collision_proximity_planner/treefksolverjointposaxis_partial.hpp>
00043 #include <ros/ros.h>
00044 #include <kdl/tree.hpp>
00045 #include <kdl/chain.hpp>
00046 #include <boost/shared_ptr.hpp>
00047
00048 #include <sensor_msgs/JointState.h>
00049
00050 #include <map>
00051 #include <vector>
00052 #include <string>
00053 #include <Eigen/Core>
00054 #include <cstdlib>
00055
00056 namespace chomp
00057 {
00058
00066 class ChompRobotModel
00067 {
00068 public:
00069
00073 struct ChompJoint
00074 {
00075 const KDL::Joint* kdl_joint_;
00076 int kdl_joint_index_;
00077 int chomp_joint_index_;
00078 std::string joint_name_;
00079 std::string link_name_;
00080 bool wrap_around_;
00081 bool has_joint_limits_;
00082 double joint_limit_min_;
00083 double joint_limit_max_;
00084 double joint_update_limit_;
00085 };
00086
00090 struct ChompPlanningGroup
00091 {
00092 std::string name_;
00093 int num_joints_;
00094 std::vector<ChompJoint> chomp_joints_;
00095 std::vector<std::string> link_names_;
00096 boost::shared_ptr<KDL::TreeFkSolverJointPosAxisPartial> fk_solver_;
00101 template <typename Derived>
00102 void getRandomState(Eigen::MatrixBase<Derived>& state_vec) const;
00103
00104 };
00105
00106 ChompRobotModel();
00107 virtual ~ChompRobotModel();
00108
00114 bool init(const planning_environment::CollisionModels* model);
00115
00119 const ChompPlanningGroup* getPlanningGroup(const std::string& group_name) const;
00120
00124 int getNumKDLJoints() const;
00125
00129 const KDL::Tree* getKDLTree() const;
00130
00136 int urdfNameToKdlNumber(const std::string& urdf_name) const;
00137
00143 const std::string kdlNumberToUrdfName(int kdl_number) const;
00144
00145 const KDL::TreeFkSolverJointPosAxis* getForwardKinematicsSolver() const;
00146
00147 const std::string& getReferenceFrame() const;
00148
00157 template<typename T>
00158 void jointMsgToArray(T& msg_vector, Eigen::MatrixXd::RowXpr joint_array);
00159
00168 template<typename T>
00169 void jointMsgToArray(T& msg_vector, KDL::JntArray& joint_array);
00170
00171 void jointStateToArray(const sensor_msgs::JointState &joint_state, KDL::JntArray& joint_array);
00172
00173 void jointStateToArray(const sensor_msgs::JointState &joint_state, Eigen::MatrixXd::RowXpr joint_array);
00174
00175 void publishCollisionPoints(ros::Publisher& vis_marker);
00176 void getActiveJointInformation(const std::string &link_name, std::vector<int>& active_joints, int& segment_number);
00177
00178 private:
00179 ros::NodeHandle node_handle_,root_handle_;
00181 KDL::Tree kdl_tree_;
00182 int num_kdl_joints_;
00183 std::map<std::string, std::string> joint_segment_mapping_;
00184 std::map<std::string, std::string> segment_joint_mapping_;
00185 std::vector<std::string> kdl_number_to_urdf_name_;
00186 std::map<std::string, int> urdf_name_to_kdl_number_;
00187 std::map<std::string, ChompPlanningGroup> planning_groups_;
00188 KDL::TreeFkSolverJointPosAxis *fk_solver_;
00189 std::string reference_frame_;
00190 double max_radius_clearance_;
00192 void getLinkInformation(const std::string link_name, std::vector<int>& active_joints, int& segment_number);
00193
00194
00195
00196 };
00197
00199
00200 inline const ChompRobotModel::ChompPlanningGroup* ChompRobotModel::getPlanningGroup(const std::string& group_name) const
00201 {
00202 std::map<std::string, ChompRobotModel::ChompPlanningGroup>::const_iterator it = planning_groups_.find(group_name);
00203 if (it == planning_groups_.end())
00204 return NULL;
00205 else
00206 return &(it->second);
00207 }
00208
00209 inline int ChompRobotModel::getNumKDLJoints() const
00210 {
00211 return num_kdl_joints_;
00212 }
00213
00214 inline const KDL::Tree* ChompRobotModel::getKDLTree() const
00215 {
00216 return &kdl_tree_;
00217 }
00218
00219 inline int ChompRobotModel::urdfNameToKdlNumber(const std::string& urdf_name) const
00220 {
00221 std::map<std::string, int>::const_iterator it = urdf_name_to_kdl_number_.find(urdf_name);
00222 if (it!=urdf_name_to_kdl_number_.end())
00223 return it->second;
00224 else
00225 return -1;
00226 }
00227
00228 inline const std::string ChompRobotModel::kdlNumberToUrdfName(int kdl_number) const
00229 {
00230 if (kdl_number<0 || kdl_number>=num_kdl_joints_)
00231 return std::string("");
00232 else
00233 return kdl_number_to_urdf_name_[kdl_number];
00234 }
00235
00236 inline const KDL::TreeFkSolverJointPosAxis* ChompRobotModel::getForwardKinematicsSolver() const
00237 {
00238 return fk_solver_;
00239 }
00240
00241 inline const std::string& ChompRobotModel::getReferenceFrame() const
00242 {
00243 return reference_frame_;
00244 }
00245
00246 template <typename Derived>
00247 void ChompRobotModel::ChompPlanningGroup::getRandomState(Eigen::MatrixBase<Derived>& state_vec) const
00248 {
00249 for (int i=0; i<num_joints_; i++)
00250 {
00251 double min = chomp_joints_[i].joint_limit_min_;
00252 double max = chomp_joints_[i].joint_limit_max_;
00253 if (!chomp_joints_[i].has_joint_limits_)
00254 {
00255 min = -M_PI/2.0;
00256 max = M_PI/2.0;
00257 }
00258 state_vec(i) = ((((double)rand())/RAND_MAX) * (max-min)) + min;
00259 }
00260 }
00261
00270 template<typename T>
00271 void ChompRobotModel::jointMsgToArray(T& msg_vector, Eigen::MatrixXd::RowXpr joint_array)
00272 {
00273 for (typename T::iterator it=msg_vector.begin(); it!=msg_vector.end(); it++)
00274 {
00275 std::string name = it->joint_name;
00276 int kdl_number = urdfNameToKdlNumber(name);
00277 if (kdl_number>=0)
00278 joint_array(kdl_number) = it->value[0];
00279 }
00280 }
00281
00282 template<typename T>
00283 void ChompRobotModel::jointMsgToArray(T& msg_vector, KDL::JntArray& joint_array)
00284 {
00285 for (typename T::iterator it=msg_vector.begin(); it!=msg_vector.end(); it++)
00286 {
00287 std::string name = it->joint_name;
00288 int kdl_number = urdfNameToKdlNumber(name);
00289 if (kdl_number>=0)
00290 joint_array(kdl_number) = it->value[0];
00291 }
00292 }
00293
00294 inline void ChompRobotModel::jointStateToArray(const sensor_msgs::JointState &joint_state, KDL::JntArray& joint_array)
00295 {
00296 for(unsigned int i=0; i < joint_state.name.size(); i++)
00297 {
00298 std::string name = joint_state.name[i];
00299 int kdl_number = urdfNameToKdlNumber(name);
00300 if (kdl_number>=0)
00301 joint_array(kdl_number) = joint_state.position[i];
00302 }
00303 }
00304
00305 inline void ChompRobotModel::jointStateToArray(const sensor_msgs::JointState &joint_state, Eigen::MatrixXd::RowXpr joint_array)
00306 {
00307 for(unsigned int i=0; i < joint_state.name.size(); i++)
00308 {
00309 std::string name = joint_state.name[i];
00310 int kdl_number = urdfNameToKdlNumber(name);
00311 if (kdl_number>=0)
00312 joint_array(kdl_number) = joint_state.position[i];
00313 }
00314 }
00315
00316 }
00317 #endif