メインページ | ネームスペース一覧 | クラス階層 | 構成 | Directories | ファイル一覧 | ネームスペースメンバ | 構成メンバ | ファイルメンバ | 関連ページ

HISpidar4.h

00001 #ifndef HISPIDAR4_H
00002 #define HISPIDAR4_H
00003 
00004 #include "HIHapticDevice.h"
00005 #include "HISpidarMotor.h"
00006 #include "Device/DVDeviceManager.h"
00007 #include <vector>
00008 
00009 namespace Spr {
00010 
00011 /** 4本糸のSPIDAR.
00012     糸の長さから座標計算を行ったり、出力する力覚から各モータの
00013     出力を計算したりする。出力の計算に2次計画法を用いているため,
00014     HIS/Fortran の libF77.lib libI77.lib QuadPR.lib が必要.
00015 @verbatim
00016 SPIDARの定数の設定例
00017 Init(dev, motPos, 0.5776, 2.924062107079e-5f, 0.5f, 20.0f);
00018 
00019 //  モータの取り付け位置. モータが直方体に取り付けられている場合は,
00020 #define PX  0.265f  //  x方向の辺の長さ/2
00021 #define PY  0.265f  //  y方向の辺の長さ/2
00022 #define PZ  0.265f  //  z方向の辺の長さ/2
00023 Vec3f motorPos[][4] =   //  モータの取り付け位置(中心を原点とする){
00024     {Vec3f(-PX, PY, PZ),    Vec3f( PX, PY,-PZ), Vec3f(-PX,-PY,-PZ), Vec3f( PX,-PY, PZ)},
00025     {Vec3f( PX, PY, PZ),    Vec3f(-PX, PY,-PZ), Vec3f( PX,-PY,-PZ), Vec3f(-PX,-PY, PZ)}
00026 };
00027 
00028 //  1ニュートン出すためのDAの出力電圧[V/N]
00029 //  maxon:      0.008[m] / 0.0438[Nm/A] / 0.5[A/V] =  0.365296803653
00030 //  千葉精機:   0.008[m] / 0.0277[Nm/A] / 0.5[A/V] =  0.5776
00031 sp->VoltPerNewton(0.5776f);
00032 
00033 //  1カウントの長さ [m/plus]   実測値: 2.924062107079e-5f
00034 sp->LenPerPlus(2.924062107079e-5f);
00035 
00036 //  最小張力 [N]
00037 sp->MinForce(0.5f);
00038 
00039 //  最大張力 [N]
00040 sp->MaxForce(20.0f);
00041 @endverbatim
00042 */
00043 
00044 class SPR_DLL HISpidar4: public HIForceDevice3D{
00045 public:
00046 
00047     typedef HIForceDevice3D superclass;
00048 protected:
00049     Vec3f pos;
00050     /// 位置を計算するための定数
00051     Vec3f posSqrConst;
00052     /// 位置を計算するための行列
00053     Matrix3f matPos;
00054     Vec3f phi[4];
00055     float tension[4];   // computed tension
00056     
00057 protected:
00058     /// モータ
00059     HISpidarMotor motor[4];
00060 
00061     /** 出力可能な力を計算し、その出力の得点を計算する.
00062         @param disable  使用しない糸の番号
00063         @param f        出力したい力. 出力可能な力に変更される.
00064         @param v3Str    4本の糸の向き
00065         @return 得点(力の正確さとモータ出力の大きさで決まる。
00066                 この糸を選択することの正しさ)   */
00067     float AvailableForce(int disable, Vec3f& f, Vec3f* v3Str);
00068     /// 位置を計算するための行列の初期化
00069     void InitMat();
00070 
00071 public:
00072     ///
00073     HISpidar4();
00074     /// デバイスのタイプ
00075     HIOBJECTDEF(HISpidar4);
00076     ///
00077     virtual ~HISpidar4();
00078     /// デバイスの初期化(使用前に呼ぶ)
00079     virtual bool Init(DVDeviceManager& dev);
00080     /// デバイスの初期化(使用前に呼ぶ)
00081     virtual bool Init(DVDeviceManager& dev, Vec3f* motorPos, float vpn, float lpp, float minF, float maxF);
00082     /// キャリブレーションの前に行う処理
00083     virtual bool BeforeCalib(){ SetMinForce(); return true; }
00084     /// キャリブレーション
00085     virtual bool Calib();
00086     /// 最低張力を出力
00087     void SetMinForce();
00088     /// 力の出力
00089     virtual void SetForce(const Vec3f& f, const Vec3f& t){ SetForce(f); }
00090     virtual void SetForce(const Vec3f& f){ SetForce(f, 0.1f); }
00091     virtual void SetForce(const Vec3f& f,float eff){ SetForce(f, eff, 0.0f); }
00092     virtual void SetForce(const Vec3f& f, float eff, float cont);
00093     /// デバイスの状態を更新する.
00094     virtual void Update(float dt);
00095     virtual Vec3f GetForce();
00096     virtual Vec3f GetPos(){ return pos; }
00097 
00098     HISpidarMotor* Motor(){
00099         return motor;
00100     }
00101 
00102 };
00103 
00104 
00105 }   //  namespace Spr
00106 #endif
00107 

Springheadに対してSun Apr 16 01:57:52 2006に生成されました。  doxygen 1.4.1