我从Eigen libary拨打slerp()
,如下所示:
Eigen::MatrixXf Rtime = (Eigen::Quaternionf::Identity().slerp(timer, quarts[i])).toRotationMatrix();
其中timer
是浮点数,夸脱被声明为
std::vector<Eigen::Quaternionf> quarts;
此slerp调用有时会导致读取访问冲突(大约50%的时间),这让我感到困惑。
查看堆栈框架,
我可以看到代码到达Eigen::internal::pload
,直到它中断。
一般来说,我认为我的指数不正确但即使崩溃也会崩溃
i = 0
和quarts.size() = 1
。我在向量中声明了唯一的四元数:
Eigen::Matrix3f rotMatrix;
rotMatrix = U * V;
Eigen::Quaternionf temp;
temp = rotMatrix;
quarts.push_back(temp);
其中U
和V
来自奇异值分解的计算,所以我宣布四元数的方式可能有问题吗?或者以某种方式将其存储在矢量中会影响它?我不确定。
答案 0 :(得分:2)
问题是Quaternionf
需要std::vector
无法保证的16字节对齐。更多细节there。解决方案要么使用对齐的分配器,例如:
std::vector<Quaternionf,Eigen::aligned_allocator<Quaternionf>> quats;
或在向量中使用未对齐的四元数:
std::vector<Quaternion<float,Eigen::DontAlign>> quats;