00001 #ifndef HISPIDARCALCBASE_H 00002 #define HISPIDARCALCBASE_H 00003 00004 #include <Base/BaseDebug.h> 00005 #include <Base/Affine.h> 00006 #include <Base/QuadProgram.h> 00007 #include <iostream> 00008 #include <vector> 00009 #include <math.h> 00010 00011 namespace Spr{; 00012 /** SPIDAR(糸を使った力覚提示装置)のための姿勢計算と力覚計算を行う 00013 基本クラス. 00014 インタフェース(仮想関数)と, 00015 2次計画法や繰り返し法による姿勢計算のための作業領域を用意する. 00016 void Spr::HISpidarCalcBase::MakeWireVec(), 00017 void Spr::HISpidarCalcBase::UpdatePos(), 00018 void Spr::HISpidarCalcBase::MeasureWire(), 00019 の3つの関数をオーバーライドすることで個々のSPIDARのための計算を行うように 00020 できる. */ 00021 class SPR_DLL HISpidarCalcBase{ 00022 protected: 00023 /**@name 姿勢と力覚を計算するためのパラメータ. 00024 姿勢ベクトル = a(ワイヤ長) = p(w(ワイヤ長)) 00025 a: ワイヤ長 から 姿勢ベクトル への変換関数. 00026 w: ワイヤ長 から ワイヤ接合位置ベクトル への変換関数. 00027 p: ワイヤ接合位置ベクトル から 姿勢ベクトル への変換関数 00028 00029 姿勢ベクトル = a(ワイヤ長) = p(w(ワイヤ長)) を偏微分すると 00030 Δ姿勢ベクトル = A・Δワイヤ長 = P・W・Δワイヤ長 00031 */ 00032 //@{ 00033 PTM::VVector<float> measuredLength; ///< 計測したワイヤ長 00034 PTM::VVector<float> calculatedLength; ///< 前の姿勢から計算されるワイヤ長 00035 PTM::VMatrixRow<float> matA; ///< 行列 A 00036 PTM::VMatrixRow<float> matATA; ///< A * Aの転置 00037 PTM::VVector<float> lengthDiff; ///< Δワイヤ長 = 計測ワイヤ長 - 算出ワイヤ長. lengthDiff[i] is the measured SetLength of this time minus the computed legth of last time 00038 PTM::VVector<float> lengthDiffAve; ///< Δワイヤ長の平均値 00039 PTM::VVector<float> postureDiff; ///< 求めた姿勢の変化量 = A * lengthDiff 00040 //@} 00041 VQuadProgram<float> quadpr; ///< 2次計画問題の計算クラス 00042 public: 00043 HISpidarCalcBase(){} ///< コンストラクタ 00044 virtual ~HISpidarCalcBase(){} ///< デストラクタ 00045 protected: 00046 virtual void Update()=0; ///< 姿勢情報の更新 00047 PTM::VVector<float>& Tension() { ///< 張力 00048 return quadpr.vecX; 00049 } 00050 /** 初期化 00051 @param minF 最小張力 00052 @param maxF 最大張力 00053 @param dof エンドエフェクタの自由度 */ 00054 void Init(int dof, const VVector<float>& minF, const VVector<float>& maxF); 00055 virtual void MakeWireVec()=0; ///< ワイヤ方向ベクトルの計算 00056 virtual void UpdatePos()=0; ///< ワイヤ設置位置座標の更新 00057 virtual void MeasureWire()=0; ///< ワイヤ長の計測 00058 }; 00059 00060 } // namespace Spr 00061 #endif