2017-02-02 3 views
-1

私はEigenライブラリを使用して、簡単なフォワード/インバースキネマティクスライブラリを構築しています。私は順運動学の部分のコードを書いたが、コンパイル結果はエラーになる。Eigen 3:ランタイム 'EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE'に間違いがありますか?

EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE 

問題ではなく、それが固有のファイルをmatrix.hために私を取るエラーが私の元に発生した指定されていないエラーです。これらのEigen関連の問題をどのようにデバッグできますか?

これは私のクラス定義と実装コードです。

ヘッダファイル

using namespace std; 
using namespace Eigen; 

class RobotArm 
{ 

public: 
    RobotArm(bool upperLevel); 
    Vector3d forwardKinematics(VectorXd twistAngle); 
    VectorXd inversekinematics(); 
void homeArm(); 

private: 
    Vector4d linkLengthUpper = {5, 5, 5, 5}; 
    Vector3d linkLengthLower = {5, 5, 5}; 
    Vector4d alphaUpper = {90, 90, 0, 0}; 
    Vector4d alphaLower = {90, 90, 0}; 
    double linkOffset = 0; 
    VectorXd linkLength; 
    VectorXd alpha; 
    Vector4d twistAngle; 
    double xPos, yPos, zPos; 
    MatrixX4d T; 
    MatrixX4d H; 
    Vector3d pos; 
    MatrixX4d substitute(double theta, double alpha, double a, double d); 
}; 

#endif /* defined(____RobotArm__) */ 

実装ファイル

using namespace std; 
using namespace Eigen; 

RobotArm::RobotArm(bool upperLevel) 
{ 
if(upperLevel) 
{ 
    cout << "Upper level manipulator object created" << endl; 
    RobotArm::linkLength.resize(RobotArm::linkLengthUpper.size()); 
    RobotArm::linkLength = RobotArm::linkLengthUpper; 
    RobotArm::alpha.resize(RobotArm::alphaUpper.size()); 
    RobotArm::alpha = RobotArm::alphaUpper; 

} 
else 
{ 
    cout << "Lower level manipulator object created" << endl; 
    RobotArm::linkLength = RobotArm::linkLengthUpper; 
    RobotArm::alpha = RobotArm::alphaLower; 
} 

} 

Vector3d RobotArm::forwardKinematics(VectorXd twistAngle) 
{ 
MatrixX4d H; 
H = MatrixX4d::Constant(4,4,1); 

//Update current link parameters 
for (int i = 0; i < twistAngle.size(); i++) 
{ 
    RobotArm::H *= substitute(twistAngle[i], alpha[i], linkLength[i], linkOffset); 
} 

pos(0,0) = H(0,3); 
pos(1,0) = H(1,3); 
pos(1,0) = H(2,3); 

return pos; 
} 

MatrixX4d RobotArm::substitute(double theta, double alpha, double a, double d) 
{ 
RobotArm::T << cos(theta), -sin(theta), 0, a, 
    (sin(theta)*cos(alpha)), (cos(theta)*cos(alpha)), -sin(alpha), (-  sin(alpha)*d), 
    (sin(theta)*sin(alpha)),(cos(theta)*sin(alpha)), cos(alpha), (cos(alpha)*d), 
    0, 0, 0, 1; 

return T; 
} 

基本的にはプログラムがRobotArm::forwardKinematics({theta_1,theta_2,theta_3,theta_4})theta角度の引数で呼び出されるポイントpos(x,y,z)座標返す必要があります。コーディングの背後にある数学は正しいです。 Eigenのエラーをどのようにデバッグするのかは分かりません。初めてEigenライブラリを使用すると、どんな助けにも感謝します。

ありがとうございました。

答えて

3

Vector4d alphaLower = {90, 90, 0};には4つの項目がありません。いずれかを追加するか、Vector3dに変更してください。また、twistAngleVector4dであることがわかっているとします。あなたがする必要がない限りVectorXd(動的)を使用しないでください。

Visual Studioを使用してこの外観をコンパイルする場合は、[出力]タブでエラーの原因となったソースの行を確認してください。 「エラーリスト」はすべての詳細を提供するものではありません。

+0

ありがとうございます。しかし、twistAngleは時には3つの変数しか取らないので、なぜ動的メモリ割り当てを使用したのですか。この場合、私は何をしますか?私はこのプロジェクト開発にXcodeを使用しています。 Xcodeでエラー/出力を表示する方法はありますか?コンソールウィンドウにエラーは表示されません。もう一度ありがとう。 – Vino

+1

@VinokanthVelu私はXcodeを使用しないので、完全なエラーメッセージをどのように取得するのか分かりません。しかし、彼らのサポートフォーラムや人々が私がショックを受けるのを助けることができない場合。 3つまたは4つの要素については、あなたがしたことをうまくやっています。私は 'Vector3d'と' Vector4d'でオーバーロードされたバージョンを作っていましたが、これは私のスタイルです。 – Matt

+0

ありがとうございます。私はサポートフォーラムで質問をします。また、オーバーロード部分を拡張することもできます。私はあなたが関数をオーバーロードできることを理解しています。しかし、私はその変数からtwistAngleをどのようにしてオーバーロードできますか?ありがとう。 – Vino

3

エラーが発生するASSERTは、少なくとも、行列とベクトルを正しいサイズに初期化しようとしていることを確認するために行われます。私はあなたもmatrix.h: error static assertion failed: THIS_METHOD_IS_ONLY_FOR_VECTORS_OF_A_SPECIFIC_SIZEのようなより多くの情報を得るべきだと思います。

は、この情報を考慮すると、少なくとも一つのバグがヘッダファイルであり、あなたの初期化を確認する:

Vector4d alphaLower = {90, 90, 0}; 

ベクトルを4つの成分ベクトルになるように定義していますが、唯一の3つのコンポーネントが提供されます。

関連する問題