私は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ライブラリを使用すると、どんな助けにも感謝します。
ありがとうございました。
ありがとうございます。しかし、twistAngleは時には3つの変数しか取らないので、なぜ動的メモリ割り当てを使用したのですか。この場合、私は何をしますか?私はこのプロジェクト開発にXcodeを使用しています。 Xcodeでエラー/出力を表示する方法はありますか?コンソールウィンドウにエラーは表示されません。もう一度ありがとう。 – Vino
@VinokanthVelu私はXcodeを使用しないので、完全なエラーメッセージをどのように取得するのか分かりません。しかし、彼らのサポートフォーラムや人々が私がショックを受けるのを助けることができない場合。 3つまたは4つの要素については、あなたがしたことをうまくやっています。私は 'Vector3d'と' Vector4d'でオーバーロードされたバージョンを作っていましたが、これは私のスタイルです。 – Matt
ありがとうございます。私はサポートフォーラムで質問をします。また、オーバーロード部分を拡張することもできます。私はあなたが関数をオーバーロードできることを理解しています。しかし、私はその変数からtwistAngleをどのようにしてオーバーロードできますか?ありがとう。 – Vino