00001
00002
00003
00004
00005
00006
00007
00008 #ifndef _MC_ARTICULATED_BODY_H
00009 #define _MC_ARTICULATED_BODY_H
00010
00011 #include <pthread.h>
00012 #include <map>
00013 #include <list>
00014 #include <vector>
00015 #include <ext/hash_map>
00016 #include <boost/shared_ptr.hpp>
00017 #include <Physsim/Constants.h>
00018 #include <Physsim/HashClasses.h>
00019 #include <Physsim/SVector6.h>
00020 #include <Physsim/Vector3.h>
00021 #include <Physsim/Matrix3.h>
00022 #include <Physsim/ArticulatedBody.h>
00023
00024 namespace Physsim {
00025
00026 class RigidBody;
00027
00029
00040 class MCArticulatedBody : public ArticulatedBody
00041 {
00042 public:
00043 MCArticulatedBody();
00044 MCArticulatedBody(const MCArticulatedBody& source);
00045 virtual ~MCArticulatedBody() {}
00046 virtual void clone(BasePtr& cloned, bimap<BasePtr, BasePtr>* obj_map = NULL) const;
00047 virtual bool is_struct_identical(BaseConstPtr object) const;
00048 virtual void load_state(BaseConstPtr object, bimap<BasePtr, BasePtr>* correspondence = NULL);
00049 virtual void save_state(BasePtr object, bimap<BasePtr, BasePtr>* correspondence = NULL) const;
00050 void set_links(const std::vector<ArticulatedBodyLinkPtr>& links);
00051 RigidBodyPtr find_link(const std::string& linkname) const;
00052 MCArticulatedBodyJointPtr find_joint(const std::string& jointname) const;
00053 void add_link(MCArticulatedBodyLinkPtr link);
00054 virtual VectorN get_state_deriv();
00055 virtual VectorN get_state();
00056 virtual void set_state(const VectorN& state);
00057 MatrixNPtr calc_jacobian_column(MCMCArticulatedBodyJointPtr joint, const Vector3& point);
00058 MatrixNNPtr calc_jacobian_floating_base(const VectorN& point);
00059 virtual std::list<RigidBodyPtr> get_rigid_bodies() const;
00060 virtual void reset_accumulators();
00061 virtual std::list<sorted_pair<RigidBodyPtr> > get_adjacent_links() const;
00062 void add_joint(MCArticulatedBodyJointPtr joint);
00063 void set_joints(const std::vector<MCArticulatedBodyJointPtr> joints);
00064 void update_link_transforms() const;
00065 void update_link_velocities();
00066 void apply_impulse(const Vector3& j, const Vector3& k, const Vector3& contact_point, MCArticulatedBodyLinkPtr link);
00067 virtual void compile();
00068 virtual void calc_fwd_dyn();
00069 virtual void update_visualization();
00070 virtual void load_from_xml(XMLTreeConstPtr node, std::map<std::string, BasePtr>& id_map);
00071 virtual void save_to_xml(XMLTreePtr node, std::list<BaseConstPtr>& shared_objects) const;
00072 MCArticulatedBodyPtr get_this() { return boost::dynamic_pointer_cast<MCArticulatedBody>(shared_from_this()); }
00073 MCArticulatedBodyConstPtr get_this() const { return boost::dynamic_pointer_cast<const MCArticulatedBody>(shared_from_this()); }
00074
00075
00076
00077 virtual bool joint_limit_collision(Real collision_tolerance) const { return false; }
00078 virtual void correct_joint_limit_collisions(Real collision_tolerance) {}
00079 virtual void correct_joint_limit_violations() {}
00080
00082 const std::vector<MCArticulatedBodyLinkPtr>& get_links() const { return _links; }
00083
00085 const std::vector<MCArticulatedBodyJointPtr>& get_joints() const { return _joints; }
00086
00087 private:
00089 std::vector<MCArticulatedBodyJointPtr> _joints;
00090
00092 std::vector<MCArticulatedBodyLinkPtr> _links;
00093
00095 std::map<RigidBodyPtr, unsigned> _link_idx_map;
00096 };
00097
00098 }
00099 #endif
00100