Choreonoid  1.5
BodyItem.h
Go to the documentation of this file.
1 
6 #ifndef CNOID_BODY_PLUGIN_BODY_ITEM_H
7 #define CNOID_BODY_PLUGIN_BODY_ITEM_H
8 
9 #include <cnoid/Item>
10 #include <cnoid/Body>
11 #include <cnoid/CollisionLinkPair>
12 #include <cnoid/SceneProvider>
13 #include <boost/dynamic_bitset.hpp>
14 #include <boost/optional.hpp>
15 #include "exportdecl.h"
16 
17 namespace cnoid {
18 
19 class BodyState;
20 class BodyItem;
22 class BodyItemImpl;
23 class InverseKinematics;
24 typedef boost::shared_ptr<InverseKinematics> InverseKinematicsPtr;
25 class PinDragIK;
26 typedef boost::shared_ptr<PinDragIK> PinDragIKptr;
27 class PenetrationBlocker;
28 typedef boost::shared_ptr<PenetrationBlocker> PenetrationBlockerPtr;
29 class EditableSceneBody;
30 
31 class CNOID_EXPORT BodyItem : public Item, public SceneProvider
32 {
33 public:
34  static void initializeClass(ExtensionManager* ext);
35 
36  BodyItem();
37  BodyItem(const BodyItem& org);
38  virtual ~BodyItem();
39 
40  bool loadModelFile(const std::string& filename);
41 
42  virtual void setName(const std::string& name);
43 
44  Body* body() const;
45 
46  bool isEditable() const;
47  void setEditable(bool on);
48 
49  enum PresetPoseID { INITIAL_POSE, STANDARD_POSE };
50 
51  void moveToOrigin();
52 
53  void setPresetPose(PresetPoseID id);
54 
55  Link* currentBaseLink() const;
56  void setCurrentBaseLink(Link* link);
57 
58  void calcForwardKinematics(bool calcVelocity = false, bool calcAcceleration = false);
59 
60  void copyKinematicState();
61  void pasteKinematicState();
62 
63  void storeKinematicState(BodyState& state);
64  bool restoreKinematicState(const BodyState& state);
65 
66  void storeInitialState();
67  void restoreInitialState(bool doNotify = true);
68 
69  void getInitialState(BodyState& out_state);
70  void setInitialState(const BodyState& in_state);
71 
72  // for undo, redo operations
73  void beginKinematicStateEdit();
74  void acceptKinematicStateEdit();
75  bool undoKinematicState();
76  bool redoKinematicState();
77 
78  PinDragIKptr pinDragIK();
79  InverseKinematicsPtr getCurrentIK(Link* targetLink);
80  InverseKinematicsPtr getDefaultIK(Link* targetLink);
81  PenetrationBlockerPtr createPenetrationBlocker(Link* link, bool excludeSelfCollisions = false);
82 
83  SignalProxy<void()> sigModelUpdated();
84  void notifyModelUpdate();
85 
93  SignalProxy<void()> sigKinematicStateChanged();
94 
95  void notifyKinematicStateChange(
96  bool requestFK = false, bool requestVelFK = false, bool requestAccFK = false);
97 
98  void notifyKinematicStateChange(
99  Connection& connectionToBlock,
100  bool requestFK = false, bool requestVelFK = false, bool requestAccFK = false);
101 
102  SignalProxy<void()> sigKinematicStateEdited();
103 
104  void enableCollisionDetection(bool on);
105  bool isCollisionDetectionEnabled() const;
106 
107  void enableSelfCollisionDetection(bool on);
108  bool isSelfCollisionDetectionEnabled() const;
109 
110  void clearCollisions();
111 
112  std::vector<CollisionLinkPairPtr>& collisions() { return collisions_; }
113  const std::vector<CollisionLinkPairPtr>& collisions() const { return collisions_; }
114  boost::dynamic_bitset<>& collisionLinkBitSet() { return collisionLinkBitSet_; }
115  const boost::dynamic_bitset<>& collisionLinkBitSet() const { return collisionLinkBitSet_; }
116  std::vector<CollisionLinkPairPtr>& collisionsOfLink(int linkIndex) { return collisionsOfLink_[linkIndex]; }
117  const std::vector<CollisionLinkPairPtr>& collisionsOfLink(int linkIndex) const { return collisionsOfLink_[linkIndex]; }
118  SignalProxy<void()> sigCollisionsUpdated() { return sigCollisionsUpdated_; }
119  void notifyCollisionUpdate() { sigCollisionsUpdated_(); }
120 
121  const Vector3& centerOfMass();
122 
123  bool isLeggedBody() const;
124  bool doLegIkToMoveCm(const Vector3& c, bool onlyProjectionToFloor = false);
125 
126  const Vector3& zmp() const;
127  void setZmp(const Vector3& zmp);
128  void editZmp(const Vector3& zmp);
129 
130  enum PositionType { CM_PROJECTION, HOME_COP, RIGHT_HOME_COP, LEFT_HOME_COP, ZERO_MOMENT_POINT };
131 
132  boost::optional<Vector3> getParticularPosition(PositionType posType);
133 
134  bool setStance(double width);
135 
136  virtual SgNode* getScene();
137  EditableSceneBody* sceneBody();
138  EditableSceneBody* existingSceneBody();
139 
140 protected:
141  virtual Item* doDuplicate() const;
142  virtual void doAssign(Item* item);
143  virtual void doPutProperties(PutPropertyFunction& putProperty);
144  virtual bool store(Archive& archive);
145  virtual bool restore(const Archive& archive);
146 
147 private:
148  friend class BodyItemImpl;
149  friend class PyBodyPlugin;
150  BodyItemImpl* impl;
151  std::vector<CollisionLinkPairPtr> collisions_;
152  boost::dynamic_bitset<> collisionLinkBitSet_;
153  std::vector< std::vector<CollisionLinkPairPtr> > collisionsOfLink_;
154  Signal<void()> sigCollisionsUpdated_;
155 };
156 
157 }
158 
159 #endif
Definition: SceneProvider.h:16
boost::shared_ptr< InverseKinematics > InverseKinematicsPtr
Definition: InverseKinematics.h:27
Definition: Body.h:28
Definition: SceneGraph.h:142
Definition: Archive.h:21
Definition: PinDragIK.h:18
Definition: InverseKinematics.h:14
Definition: ExtensionManager.h:26
Definition: EditableSceneBody.h:44
Definition: PutPropertyFunction.h:35
ref_ptr< BodyItem > BodyItemPtr
Definition: BodyItem.h:20
const std::vector< CollisionLinkPairPtr > & collisionsOfLink(int linkIndex) const
Definition: BodyItem.h:117
Definition: Item.h:38
const boost::dynamic_bitset & collisionLinkBitSet() const
Definition: BodyItem.h:115
Defines the minimum processing for performing pasing file for STL.
Definition: AbstractSceneLoader.h:9
SignalProxy< void()> sigCollisionsUpdated()
Definition: BodyItem.h:118
Definition: Signal.h:107
PresetPoseID
Definition: BodyItem.h:49
Eigen::Vector3d Vector3
Definition: EigenTypes.h:58
Definition: PenetrationBlocker.h:19
#define CNOID_EXPORT
Definition: Util/exportdecl.h:37
boost::dynamic_bitset & collisionLinkBitSet()
Definition: BodyItem.h:114
Definition: BodyState.h:20
Definition: BodyItem.h:31
void notifyCollisionUpdate()
Definition: BodyItem.h:119
Definition: Signal.h:380
PositionType
Definition: BodyItem.h:130
boost::shared_ptr< PenetrationBlocker > PenetrationBlockerPtr
Definition: PenetrationBlocker.h:36
std::vector< CollisionLinkPairPtr > & collisions()
Definition: BodyItem.h:112
boost::shared_ptr< PinDragIK > PinDragIKptr
Definition: PinDragIK.h:54
const std::vector< CollisionLinkPairPtr > & collisions() const
Definition: BodyItem.h:113
std::vector< CollisionLinkPairPtr > & collisionsOfLink(int linkIndex)
Definition: BodyItem.h:116