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.
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
@ 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
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