我正在尝试计算 Android 手机在房间中的大致位置。我尝试了不同的方法,例如定位(在室内很糟糕)和陀螺仪+指南针。我只需要走5-10秒就知道大致位置,所以我认为线性加速度的积分就足够了。我知道这个错误很糟糕,因为它会传播错误,但也许它会在我的设置中起作用。我只需要将相机指向 Android 手机的大概位置。
我对双重积分进行了编码,但我做错了什么。如果手机静止在 table 上,则位置 (x,y,z) 始终保持增加。有什么问题?
static final float NS2S = 1.0f / 1000000000.0f;
float[] last_values = null;
float[] velocity = null;
float[] position = null;
float[] acceleration = null;
long last_timestamp = 0;
SensorManager mSensorManager;
Sensor mAccelerometer;
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() != Sensor.TYPE_LINEAR_ACCELERATION)
return;
if(last_values != null){
float dt = (event.timestamp - last_timestamp) * NS2S;
acceleration[0]=(float) event.values[0] - (float) 0.0188;
acceleration[1]=(float) event.values[1] - (float) 0.00217;
acceleration[2]=(float) event.values[2] + (float) 0.01857;
for(int index = 0; index < 3;++index){
velocity[index] += (acceleration[index] + last_values[index])/2 * dt;
position[index] += velocity[index] * dt;
}
}
else{
last_values = new float[3];
acceleration = new float[3];
velocity = new float[3];
position = new float[3];
velocity[0] = velocity[1] = velocity[2] = 0f;
position[0] = position[1] = position[2] = 0f;
}
System.arraycopy(acceleration, 0, last_values, 0, 3);
last_timestamp = event.timestamp;
}
这些是手机放在 table 上(没有 Action )时我得到的位置。 (x,y,z) 值在增加,但手机还在。
这些是计算每个轴的移动平均值并从每个测量值中减去后的位置。电话也还在。
如何改进代码或其他方法来获取房间内的大概位置?
最佳答案
加速度计存在不可避免的测量误差。这些是由表中的微小振动、制造中的缺陷等引起的。随着时间的推移累积这些错误会导致 Random Walk .这就是为什么定位系统只能通过一些过滤器使用加速度计作为定位辅助。他们仍然需要某种形式的航位推算,例如 GPS(在室内效果不佳)。
目前对室内定位系统进行了大量研究。可以利用现有基础设施的系统研究领域包括 WiFi 和 LED 照明定位。目前还没有明显的解决方案,但我相信我们需要一个专门的解决方案来进行准确、可靠的室内定位。
你说位置一直在增加。您的意思是 x、y 和 z 分量只会变为正值,即使在重置几次之后也是如此?或者你的意思是位置不断从零开始漂移?
如果您在手机静止时输出原始加速度测量值,您应该会看到测量错误。在 Excel 电子表格中放入一堆这些测量值。计算平均值和标准偏差。所有轴的平均值应为零。如果没有,您可以使用简单的平均过滤器在代码中消除偏差(计算运行平均值并从每个结果中减去该平均值)。标准偏差将显示在 N 个时间步长后每个轴上可以漂移多远,如 standard_deviation * sqrt(N)。这应该可以帮助您从数学上确定作为时间(或 N 个时间步长)函数的预期准确度。
关于android - 使用线性加速度积分的近似室内定位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17552728/