2017-02-02 5 views
-1

Ich benutze Eigen Bibliothek, um eine einfache Vorwärts/Inverse Kinematik Bibliothek zu erstellen. Ich habe den Code für den Vorwärtskinematikteil geschrieben, aber die Kompilierung führt zu einem Fehler;Eigen 3: Laufzeit 'EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE' Fehler?

EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE 

Das Problem ist der Fehler nicht angibt, wo der Fehler in meiner ursprünglichen aufgetreten ist, anstatt es mir Datei von Eigen matrix.h nimmt. Wie debugge ich Eigen Probleme wie diese?

Dies ist meine Klassendefinition und Implementierungscode.

Header-Datei

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__) */ 

Implementierungsdatei

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; 
} 

Grundsätzlich sollte das Programm zurück pos(x,y,z) Koordinatenpunkten, wenn RobotArm::forwardKinematics({theta_1,theta_2,theta_3,theta_4}) mit theta Winkel Argumenten aufgerufen wird. Die Mathematik hinter der Codierung ist korrekt. Ich bin mir nicht sicher, wie ich den von Eigen gezeigten Fehler debuggen soll. Beim erstmaligen Verwenden der Eigenen Bibliothek wird jede Hilfe geschätzt.

Danke.

Antwort

3

Vector4d alphaLower = {90, 90, 0}; hat nicht 4 Elemente, fügen Sie entweder ein viertes hinzu oder ändern Sie zu Vector3d. Auch wenn Sie wissen, dass twistAngle ist ein Vector4d machen Sie es. Verwenden Sie nicht VectorXd (dynamisch), es sei denn, Sie müssen.

Wenn Sie Visual Studio verwenden, um diesen Blick auf die Registerkarte "Ausgabe" zu kompilieren, um zu sehen, welche Zeile in Ihrer Quelle den Fehler verursacht hat. Die "Fehlerliste" enthält nicht alle Details.

+0

Vielen Dank. Aber twistAngle benötigt manchmal nur 3 Variablen, deshalb habe ich die dynamische Speicherzuweisung verwendet. Was mache ich in diesem Fall? Ich verwende Xcode für diese Projektentwicklung. Gibt es eine Möglichkeit, Fehler/Ausgaben auf Xcode zu sehen? Das Konsolenfenster zeigt keine Fehler an. Nochmals vielen Dank. – Vino

+1

@ VinokanthVelu Ich benutze Xcode nicht, also weiß ich nicht, wie man die volle Fehlermeldung daraus bekommt. Aber wenn ihre Unterstützungsforen und Leute nicht helfen können, wäre ich schockiert. Wie für 3 oder 4 Elemente, Sie sind in Ordnung, was Sie getan haben. Ich würde eine überladene Version mit 'Vector3d' und' Vector4d' machen, aber das ist nur mein Stil. – Matt

+0

Vielen Dank. Ich werde eine Frage zum Support-Forum stellen. Auch können Sie den Überladungsteil erweitern. Ich verstehe, dass Sie eine Funktion überladen können. Aber wie kann ich twistAngle? Überladen, da es eine Variable ist. Vielen Dank. – Vino

3

Die ASSERT, die Ihnen den Fehler gibt, ist mindestens zu überprüfen, dass Sie versuchen, Matrizen und Vektoren zu initialisieren, um die richtige Größe zu haben. Ich denke, Sie sollten auch mehr Informationen wie matrix.h: error static assertion failed: THIS_METHOD_IS_ONLY_FOR_VECTORS_OF_A_SPECIFIC_SIZE bekommen.

diese Informationen gegeben und Ihre Initialisierungen Überprüfung gibt es mindestens einen Fehler in der Header-Datei:

Vector4d alphaLower = {90, 90, 0}; 

Der Vektor ein Vier-Komponenten-Vektor zu sein, aber nur drei Komponenten gibt definiert ist.