有没有人只使用iPhone传感器开发6DOF姿势估计,而不是视频?理解加速度计和陀螺仪的漂移.
陀螺仪提供相当可靠的相对定向速率.我已经能够用陀螺仪数据进行开发.
但是,我从加速度计中获得翻译时遇到了更多问题.加速度的双重积分导致无用的位置数据非常快(不到半秒).
我试图通过校准步骤消除偏差,但位置仍然很差.更糟糕的是,偏见不是恒定的.它随着时间的推移而变化,噪音使信号淹没.
我很感兴趣,如果有人能够开发出只有加速度计和陀螺仪的6DOF,它可以在5-10秒内可靠地工作,并且在平移和方向上几乎没有漂移.
我想我找到了问题的答案.VFP有一个"fmacs"指令可以执行在NEON/VFP寄存器上进行标量计算的技巧.
我对NEON或ARM编程很新...
我想将一个上三角矩阵加载到NEON寄存器中,并使用单精度积分(累加)矢量的外积.基本思想是A + = x'*x,其中A是上三角矩阵.一些操作可以通过在四重或双重寄存器上使用NEON指令"vmla.f32"来矢量化操作来完成.但是,有时我只需要在一个精度寄存器1上操作,即不在2或4个单精度寄存器上操作.在下面的例子中(不起作用),我对该行很感兴趣
// A[8-14] += A[1]*x[1-7]
"mla s16, s16, d0[1]\n\t"
Run Code Online (Sandbox Code Playgroud)
我想使用NEON寄存器执行一次单精度操作.
代码段:
__asm__ volatile (
//load x into registers
"vldmia %0, {d0-d3}\n\t"
// load A into registers
"vldmia %1, {d4-d12}\n\t"
"vldmia %1, {d13-d21}\n\t"
// A[0-7] += x[0]*x[0-7]
"vmla.f32 q2, q2, d0[0]\n\t"
"vmla.f32 q3, q3, d0[0]\n\t"
// A[8-14] += A[1]*x[1-7]
"mla s16, s16, d0[1]\n\t"
// output
:
// input
: "r"(A), "r"(x)
// registers
: "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", "q8", "q9", "q10"
);
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用NEON在iPhone ARM上针对特定问题实现Gauss-Newton优化.下面的第一个函数是我原来的C函数.第二个是我写的NEON asm代码.我每次运行100,000次,NEON版本比C版本长7-8倍.我认为加载(vld1.32)是大部分时间.我通过删除一些指令进行了实验.
有没有人对这个问题有任何见解?谢谢!
template<class T>
inline void GaussNewtonOperationJtr8x8(T Jtr[8], const T J[8], T residual)
{
Jtr[0] -= J[0]*residual;
Jtr[1] -= J[1]*residual;
Jtr[2] -= J[2]*residual;
Jtr[3] -= J[3]*residual;
Jtr[4] -= J[4]*residual;
Jtr[5] -= J[5]*residual;
Jtr[6] -= J[6]*residual;
Jtr[7] -= J[7]*residual;
}
inline void GaussNewtonOperationJtr8x8_NEON(NFloat Jtr[8], const NFloat J[8], NFloat residual)
{
__asm__ volatile (
// load Jtr into registers
"vld1.32 {d0-d3}, [%0]\n\t"
// load J into registers
"vld1.32 {d4-d7}, [%1]\n\t"
// load residual in register
"vmov.f32 s16, %2\n\t"
// Jtr …Run Code Online (Sandbox Code Playgroud) 我正在尝试将一个char值数组加载到NEON寄存器中,然后将它们视为16位或32位整数值.所以像这样......
void SubVector(short* c, const unsigned char* a, const unsigned char* b, int n)
{
for(int i = 0; i < n; i++)
{
c[i] = (short)a[i] - (short)b[i];
}
}
Run Code Online (Sandbox Code Playgroud)
我不确定如何加载数据.我应该将8位数据加载到通道中,然后将寄存器重新解释为短路吗?或加载和转换?什么是最快的方式?
有没有人有一个关于如何使用NEON内在函数做到这一点的例子?
谢谢!