2016-09-06 2 views
0

私は、固有行列ライブラリを備えたロボットアームの順運動および逆運動を計算するソフトウェアを書こうとしています。コンマ区切りの動的マトリックスを初期化するのに問題があります。私はEXC_BAD_ACCESS LLDBデバッガのバグを実行しています。私はLLDBデバッガを初めて使っていて、それを使っているホットデバッグについてはあまりよく分かりません。固有名詞:動的行列を初期化するコンマ

これは私のmain.cppコードであり、私のクラス定義とクラスRobotArmの実装はうまくいくようです。

#include <iostream> 
#include <Eigen/Dense> 
#include "RobotArm.h" 

using namespace Eigen; 
using namespace std; 

int main(int argc, const char * argv[]) 
{ 
    RobotArm testArm; 
    MatrixXd E(5,4); 

    E << 0, 0, 0, 10, 
     90, 30, 5, 0, 
     0, 30, 25, 0, 
     0, 30, 25, 0, 
     0, 30, 0, 0; 

    Vector3d POS = testArm.forwardKinematics(E); 
    cout << "Position vector [X Y Z]" << POS << endl; 
    return 0; 
} 

この

は私RobotArm.h

#ifndef ____RobotArm__ 
#define ____RobotArm__ 

#include <stdio.h> 
#include <Eigen/Dense> 
#include <math.h> 

using namespace std; 
using namespace Eigen; 

class RobotArm 
{ 

public: 
    //Constructor 
    RobotArm(); 
    Vector3d forwardKinematics(MatrixXd DH); 
    VectorXd inversekinematics(); 
    void homeArm(); 

private: 
    double xPos, yPos, zPos; 
    MatrixX4d T; 
    MatrixX4d H; 
    Vector3d pos; 
    MatrixX4d substitute(double alpha, double theta, double a, double d); 


}; 

#endif /* defined(____RobotArm__) */ 

ですこれは私のRobotArm.cpp

#include "RobotArm.h" 
#include <stdio.h> 
#include <Eigen/Dense> 
#include <cmath> 
#include <iostream> 

using namespace std; 
using namespace Eigen; 


RobotArm::RobotArm() 
{ 
    cout << "Successfully created RobotArm object" << endl; 
} 

Vector3d RobotArm::forwardKinematics(MatrixXd DH) 
{ 
    MatrixX4d H; 
    //H = MatrixX4d::Constant(4,4,1); 
    H << 1,1,1,1, 
     1,1,1,1, 
     1,1,1,1, 
     1,1,1,1; 


    //Update current link parameters 
    for (int i = 0; i < 6; i++) 
    { 
     H *= substitute(DH(i,0), DH(i,1), DH(i,2), DH(i,3)); 
    } 

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

    return pos; 
} 

MatrixX4d RobotArm::substitute(double alpha, double theta, double a, double d) 
{ 
    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; 
} 
main.cppに上の行列Eを初期化しようとしたときにエラーが発生しているようだ

ある

注:ソフトウェアはまだ開発中です。私が投稿したのは自分のクラスをテストするためのものです。 LLDBデバッガの使い方を学んでください。ありがとうございました。

答えて

3

実際、問題はRobotArm.hとRobotArm.cppにあります。 MatrixX4dは、半動的マトリックスです。あなたが望むものはMatrix4dです。これは静的サイズの4x4マトリックスです。 MatrixX4dタイプでは、operator<<を呼び出す前のサイズは0x4です。したがって、値を割り当てようとするとアクセス違反が発生します。

あなたは例えば、それを使用する前に行列のサイズを変更することを確認した後、MatrixX4dを使用する必要がある場合:

Eigen::MatrixX4d H; 
H.resize(whateverSizeYouWantTheOtherDimensionToBe, Eigen::NoChange); 
+0

はあなたに@Aviギンズバーグをありがとう:)私は引数として5x4行列を必要とすることを恐れていますRobotArm :: forward kinematics()。 Matrix4dの代わりにMatrixXdを使用する必要があります。何かご意見は? – Vino

+0

答えていただきありがとうございます:)しかし、私はまだ問題があります - "アサーションに失敗しました";私は、それは私のコードをコンパイルするためにLLDBデバッガを使用することを学ぶための良い出発点になると思う:)ヘルプのための乾杯 – Vino

関連する問題