00001
00002
00003
00004
00005
00006
00007 #ifndef _UNIVERSAL_JOINT_H
00008 #define _UNIVERSAL_JOINT_H
00009
00010 #include <Physsim/Joint.h>
00011
00012 namespace Physsim {
00013
00015 class UniversalJoint : public Joint
00016 {
00017 public:
00018 enum Axis { eAxis1, eAxis2 };
00019
00020 UniversalJoint();
00021 virtual ~UniversalJoint() {}
00022 virtual void clone(BasePtr& cloned, bimap<BasePtr, BasePtr>* obj_map = NULL) const;
00023 virtual void load_state(BaseConstPtr object, bimap<BasePtr, BasePtr>* correspondence = NULL);
00024 virtual void save_state(BasePtr object, bimap<BasePtr, BasePtr>* correspondence = NULL) const;
00025 UniversalJoint(boost::weak_ptr<RigidBody> inboard, boost::weak_ptr<RigidBody> outboard);
00026 Vector3 get_axis_global(Axis a) const;
00027 void set_axis_global(const Vector3& axis, Axis a);
00028 void set_axis_local(const Vector3& axis, Axis a);
00029 virtual void update_spatial_axes();
00030 virtual void determine_Q();
00031 virtual const Matrix4& get_transform();
00032 virtual const SMatrixN& get_spatial_axes(ReferenceFrameType type);
00033 virtual const SMatrixN& get_spatial_axes_deriv(ReferenceFrameType type);
00034 virtual void load_from_xml(XMLTreeConstPtr node, std::map<std::string, BasePtr>& id_map);
00035 virtual void save_to_xml(XMLTreePtr node, std::list<BaseConstPtr>& shared_objects) const;
00036 virtual unsigned get_num_dof() const { return 2; }
00037
00039 virtual bool is_singular_config() const { return false; }
00040
00042
00049 const Vector3& get_axis_local(Axis a) const { return _u[a]; }
00050
00051 private:
00052 virtual void update_visualization();
00053 Matrix3 get_rotation() const;
00054
00056 Matrix3 _R;
00057
00059 bool _si_computed;
00060
00062 bool _si_dot_computed;
00063
00065 Real _last_q1;
00066
00068 Real _last_sid_q1, _last_qd1;
00069
00071 std::vector<Vector3> _u;
00072
00074 Matrix4 _T;
00075
00077 SMatrixN _si_dot_i;
00078
00080 SMatrixN _si_dot_0;
00081 };
00082 }
00083
00084 #endif
00085