特征 3:运行时"EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE"错误?

Eigen 3: Runtime 'EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE' error?

本文关键字:SPECIFIC VECTOR SIZE ASSERT 错误 STATIC 运行时 EIGEN 特征      更新时间:2023-10-16

我正在使用本征库来构建一个简单的正向/反向运动学库。我已经为前向运动学部分编写了代码,但编译导致错误;

EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE

问题是错误没有指定错误在我的原始文件中发生的位置,而是将我带到 Eigen 的 matrix.h 文件。如何调试此类与特征相关的问题?

这是我的类定义和实现代码。

头文件

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

基本上,程序应该返回坐标点pos(x,y,z)当使用theta角度参数调用RobotArm::forwardKinematics({theta_1,theta_2,theta_3,theta_4})时。编码背后的数学是正确的。我不太确定如何调试 Eigen 显示的错误。第一次使用特征库,任何帮助将不胜感激。

谢谢。

Vector4d alphaLower = {90, 90, 0};没有

4 个项目,要么添加第四个项目,要么更改为 Vector3d 个。 另外,如果您知道twistAngle是一种Vector4d那就去做吧。 除非必要,否则不要使用VectorXd(动态)。

如果您使用 Visual Studio 编译此内容,请查看"输出"选项卡,以查看源中的哪一行导致错误。 "错误列表"没有提供所有详细信息。

ASSERT ,这给您带来了错误,至少是为了检查您是否尝试将矩阵和向量初始化为正确的大小。我认为您还应该获得更多信息,例如matrix.h: error static assertion failed: THIS_METHOD_IS_ONLY_FOR_VECTORS_OF_A_SPECIFIC_SIZE.

给定此信息并检查初始化,头文件中至少存在一个错误:

Vector4d alphaLower = {90, 90, 0};
向量

定义为四分量向量,但您只给出三个分量。