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 PLANNING_MODELS_KINEMATIC_STATE_
00038 #define PLANNING_MODELS_KINEMATIC_STATE_
00039
00040 #include "kinematic_model.h"
00041
00043 namespace planning_models
00044 {
00045
00049 class KinematicState
00050 {
00051
00052 public:
00053
00054 class JointState; ;
00055
00056 class LinkState;
00058 class AttachedBodyState;
00060 class JointGroupState;
00062 class JointState
00063 {
00064 public:
00065
00067 JointState(const KinematicModel::JointModel* jm);
00068
00069 ~JointState()
00070 {
00071 }
00072
00074 bool setJointStateValues(const std::map<std::string, double>& joint_value_map);
00075
00077 bool setJointStateValues(const std::map<std::string, double>& joint_value_map,
00078 std::vector<std::string>& missing_states);
00079
00081 bool setJointStateValues(const std::vector<double>& joint_value_vector);
00082
00084 bool setJointStateValues(const tf::Transform& transform);
00085
00088 bool allJointStateValuesAreDefined(const std::map<std::string, double>& joint_value_map) const;
00089
00092 bool getJointValueBounds(const std::string& value_name, double& low, double& high) const;
00093
00095 const std::map<std::string, std::pair<double, double> >& getAllJointValueBounds() const;
00096
00098 bool areJointStateValuesWithinBounds() const;
00099
00100 const std::string& getName() const
00101 {
00102 return joint_model_->getName();
00103 }
00104
00106 unsigned int getDimension()
00107 {
00108 return joint_state_values_.size();
00109 }
00110
00112 const std::vector<double>& getJointStateValues() const;
00113
00115 const std::vector<std::string>& getJointStateNameOrder() const;
00116
00118 const tf::Transform& getVariableTransform() const
00119 {
00120 return variable_transform_;
00121 }
00122
00124 const KinematicModel::JointModel* getJointModel() const
00125 {
00126 return joint_model_;
00127 }
00128
00129 const std::map<std::string, unsigned int>& getJointStateIndexMap() const
00130 {
00131 return joint_state_index_map_;
00132 }
00133
00134 const std::string& getParentFrameId() const
00135 {
00136 return joint_model_->getParentFrameId();
00137 }
00138
00139 const std::string& getChildFrameId() const
00140 {
00141 return joint_model_->getChildFrameId();
00142 }
00143
00144 private:
00145
00146 const KinematicModel::JointModel* joint_model_;
00147
00149 tf::Transform variable_transform_;
00150
00151 std::map<std::string, unsigned int> joint_state_index_map_;
00152
00153 std::vector<std::string> joint_state_name_order_;
00154
00155 std::vector<double> joint_state_values_;
00156 };
00157
00158 class LinkState
00159 {
00160 public:
00161 LinkState(const KinematicModel::LinkModel* lm);
00162
00163 ~LinkState();
00164
00165 const std::string& getName() const
00166 {
00167 return link_model_->getName();
00168 }
00169
00170 void setParentJointState(const JointState* js)
00171 {
00172 parent_joint_state_ = js;
00173 }
00174
00175 void setParentLinkState(const LinkState* ls)
00176 {
00177 parent_link_state_ = ls;
00178 }
00179
00180 void updateGivenGlobalLinkTransform(const tf::Transform& transform)
00181 {
00182 global_link_transform_ = transform;
00183 global_collision_body_transform_.mult(global_link_transform_, link_model_->getCollisionOriginTransform());
00184 updateAttachedBodies();
00185 }
00186
00188 void computeTransform(void);
00189
00190
00191 void updateAttachedBodies();
00192
00193 const KinematicModel::LinkModel* getLinkModel() const
00194 {
00195 return link_model_;
00196 }
00197
00198 const JointState* getParentJointState() const
00199 {
00200 return parent_joint_state_;
00201 }
00202
00203 const LinkState* getParentLinkState() const
00204 {
00205 return parent_link_state_;
00206 }
00207
00208 const std::vector<AttachedBodyState*>& getAttachedBodyStateVector() const
00209 {
00210 return attached_body_state_vector_;
00211 }
00212
00213 const tf::Transform& getGlobalLinkTransform() const
00214 {
00215 return global_link_transform_;
00216 }
00217
00218 const tf::Transform& getGlobalCollisionBodyTransform() const
00219 {
00220 return global_collision_body_transform_;
00221 }
00222
00223 private:
00224
00225 const KinematicModel::LinkModel* link_model_;
00226
00227 const JointState* parent_joint_state_;
00228
00229 const LinkState* parent_link_state_;
00230
00231 std::vector<AttachedBodyState*> attached_body_state_vector_;
00232
00234 tf::Transform global_link_transform_;
00235
00237 tf::Transform global_collision_body_transform_;
00238 };
00239
00240 class AttachedBodyState
00241 {
00242 public:
00243 AttachedBodyState(const KinematicModel::AttachedBodyModel* abm, const LinkState* parent_link_state);
00244
00245 ~AttachedBodyState()
00246 {
00247 }
00248
00249 const std::string& getName() const
00250 {
00251 return attached_body_model_->getName();
00252 }
00253
00254 const std::string& getAttachedLinkName() const
00255 {
00256 return attached_body_model_->getAttachedLinkModel()->getName();
00257 }
00258
00259 const KinematicModel::AttachedBodyModel* getAttachedBodyModel() const
00260 {
00261 return attached_body_model_;
00262 }
00263
00265 void computeTransform(void);
00266
00267 const std::vector<tf::Transform>& getGlobalCollisionBodyTransforms() const
00268 {
00269 return global_collision_body_transforms_;
00270 }
00271
00272 private:
00273 const KinematicModel::AttachedBodyModel* attached_body_model_;
00274
00275 const LinkState* parent_link_state_;
00276
00278 std::vector<tf::Transform> global_collision_body_transforms_;
00279
00280 };
00281
00282 class JointStateGroup
00283 {
00284 public:
00285
00286 JointStateGroup(const KinematicModel::JointModelGroup* jmg, const KinematicState* owner);
00287
00288
00289
00290 ~JointStateGroup(void)
00291 {
00292 }
00293
00294 const KinematicModel::JointModelGroup* getJointModelGroup() {
00295 return joint_model_group_;
00296 }
00297
00298 const std::string& getName() const
00299 {
00300 return joint_model_group_->getName();
00301 }
00302
00303 unsigned int getDimension() const
00304 {
00305 return dimension_;
00306 }
00307
00312 bool setKinematicState(const std::vector<double>& joint_state_values);
00313
00318 bool setKinematicState(const std::map<std::string, double>& joint_state_map);
00319
00321 void updateKinematicLinks();
00322
00324 bool hasJointState(const std::string &joint) const;
00325
00327 bool updatesLinkState(const std::string& joint) const;
00328
00330 JointState* getJointState(const std::string &joint) const;
00331
00332 void getKinematicStateValues(std::vector<double>& joint_state_values) const;
00333
00334 void getKinematicStateValues(std::map<std::string, double>& joint_state_values) const;
00335
00339 void setKinematicStateToDefault();
00340
00341 const std::vector<JointState*>& getJointRoots() const
00342 {
00343 return joint_roots_;
00344 }
00345
00346 const std::map<std::string, unsigned int>& getKinematicStateIndexMap() const
00347 {
00348 return kinematic_state_index_map_;
00349 }
00350
00351 const std::vector<std::string>& getJointNames() const
00352 {
00353 return joint_names_;
00354 }
00355
00356 const std::vector<JointState*>& getJointStateVector() const
00357 {
00358 return joint_state_vector_;
00359 }
00360
00361 private:
00362
00364 boost::shared_ptr<KinematicModel> kinematic_model_;
00365
00366 const KinematicModel::JointModelGroup* joint_model_group_;
00367
00368 unsigned int dimension_;
00369 std::map<std::string, unsigned int> kinematic_state_index_map_;
00370
00372 std::vector<std::string> joint_names_;
00373
00375 std::vector<JointState*> joint_state_vector_;
00376
00378 std::map<std::string, JointState*> joint_state_map_;
00379
00381 std::vector<JointState*> joint_roots_;
00382
00384 std::vector<LinkState*> updated_links_;
00385 };
00386
00387 KinematicState(const KinematicModel* kinematic_model);
00388
00389 KinematicState(const KinematicState& state);
00390
00391 ~KinematicState(void);
00392
00393 bool setKinematicState(const std::vector<double>& joint_state_values);
00394
00395 bool setKinematicState(const std::map<std::string, double>& joint_state_map);
00396
00397 bool setKinematicState(const std::map<std::string, double>& joint_state_map,
00398 std::vector<std::string>& missing_links);
00399
00400 void getKinematicStateValues(std::vector<double>& joint_state_values) const;
00401
00402 void getKinematicStateValues(std::map<std::string, double>& joint_state_values) const;
00403
00404 void updateKinematicLinks();
00405
00406 bool updateKinematicStateWithLinkAt(const std::string& link_name, const tf::Transform& transform);
00407
00408 const KinematicModel* getKinematicModel() const
00409 {
00410 return kinematic_model_;
00411 }
00412
00413 unsigned int getDimension() const {
00414 return dimension_;
00415 }
00416
00417 std::vector<LinkState*> getChildLinkStates(const std::string& link_name) const;
00418
00419 void setKinematicStateToDefault();
00420
00421 bool areJointsWithinBounds(const std::vector<std::string>& joints) const;
00422
00423 bool isJointWithinBounds(const std::string& joint) const;
00424
00426 const JointStateGroup* getJointStateGroup(const std::string &name) const;
00427
00429 JointStateGroup* getJointStateGroup(const std::string &name);
00430
00432 bool hasJointStateGroup(const std::string &name) const;
00433
00435 bool hasJointState(const std::string &joint) const;
00436
00438 bool hasLinkState(const std::string& joint) const;
00439
00441 JointState* getJointState(const std::string &joint) const;
00442
00444 LinkState* getLinkState(const std::string &link) const;
00445
00447 AttachedBodyState* getAttachedBodyState(const std::string &attached) const;
00448
00449 const std::vector<JointState*>& getJointStateVector() const
00450 {
00451 return joint_state_vector_;
00452 }
00453
00454 std::vector<JointState*>& getJointStateVector()
00455 {
00456 return joint_state_vector_;
00457 }
00458
00459 const std::vector<LinkState*>& getLinkStateVector() const
00460 {
00461 return link_state_vector_;
00462 }
00463
00464 const std::vector<const AttachedBodyState*>& getAttachedBodyStateVector() const
00465 {
00466 return attached_body_state_vector_;
00467 }
00468
00469 const std::map<std::string, JointStateGroup*>& getJointStateGroupMap() const
00470 {
00471 return joint_state_group_map_;
00472 }
00473
00474 void getJointStateGroupNames(std::vector<std::string>& names) const;
00475
00476 const std::map<std::string, unsigned int> getKinematicStateIndexMap() const
00477 {
00478 return kinematic_state_index_map_;
00479 }
00480
00482 void printStateInfo(std::ostream &out = std::cout) const;
00483
00485 void printTransforms(std::ostream &out = std::cout) const;
00486
00487 void printTransform(const std::string &st, const tf::Transform &t, std::ostream &out = std::cout) const;
00488
00489 const tf::Transform& getRootTransform() const;
00490
00491 private:
00492
00493 void setLinkStatesParents();
00494
00495 const KinematicModel* kinematic_model_;
00496
00497 unsigned int dimension_;
00498 std::map<std::string, unsigned int> kinematic_state_index_map_;
00499
00500 std::vector<JointState*> joint_state_vector_;
00501 std::map<std::string, JointState*> joint_state_map_;
00502
00503 std::vector<LinkState*> link_state_vector_;
00504 std::map<std::string, LinkState*> link_state_map_;
00505
00506
00507 std::vector<const AttachedBodyState*> attached_body_state_vector_;
00508
00509 std::map<std::string, JointStateGroup*> joint_state_group_map_;
00510 };
00511
00512 }
00513
00514 #endif