我正在写一张显示海拔高度的表脸。高度用SensorManager.getAltitude(seaLevelPressure, currentPresure)计算。
但是为了初始化这一点,我需要海平面上的压力。不幸的是,没有SensorManager.getSeaLevelPressure(currentPressure,currentAltitude)。
为此,我找到了以下公式(参见http://rechneronline.de/barometer/ )
private float calcSeaPressure(float pressure, int altitude) {
float temperature = 9 + 273.15f;
float tempGradient = 0.0065f;
float v3 = temperature + tempGradient * altitude;
float sealevelPressure = (float) (pressure / Math.pow((1 - tempGradient * altitude / v3), .03416f / tempGradient));
sealevelPressure = (float) Math.round(sealevelPressure * 100) / 100;
return sealevelPressure;
}但是,该算法与SensorManager.getAltitude中的算法似乎不太吻合。如果我这样做了:
public void setCurrentAltitude(int currentAltitude) {
sealLevelPressure = calcSealevel(currentAltitude,currentPresure);
altitude = SensorManager.getAltitude(seaLevelPressure, currentPresure)
}计算的高度与给定的currentAltitude不同。对于小值(<1000米),差异是可以接受的。但以4000米为例,差距是250米,这是不可接受的。
现在,我的问题是:如何计算海平面,以便setCurrentAltitude()不报告不同的值?
或者您知道其他Java类可以用于此吗?记住,这些值应该计算出来!
谢谢
发布于 2015-03-01 10:27:11
如果您是从一个高度(毕竟您有setCurrentAltitude方法)校准,那么这是一种技术:
public void setCalibrationAltitudeAndPressure(float calibrationAltitude, float currentPressure) {
this.calibrationAltitude = calibrationAltitude;
this.calibrationPressure = currentPressure;
}
public float getCurrentAltitude(float currentPressure) {
float altitudeDifference =
sensorManager.getAltitude(SensorManager.PRESSURE_STANDARD_ATMOSPHERE, currentPressure) -
sensorManager.getAltitude(SensorManager.PRESSURE_STANDARD_ATMOSPHERE, calibrationPresure);
return calibrationAltitude + altitudeDifference;
}现在你不需要关心海平面压力了。
校准
你需要一个校准高度,你可以使用全球定位系统。它的高度不太可能是准确的(见Android: How to get accurate altitude?),但您可以使用lat和lat从这项服务获得高度:https://developers.google.com/maps/documentation/elevation/,但这对在飞机上使用该应用程序的人是不好的!
但是,如果你正为此打一个发球,那么你最好从一个服务得到准确的海平面压力:http://www.worldweatheronline.com/api/marine-weather-api.aspx。
发布于 2015-03-01 10:16:40
关于getAltitude()的文档说:
通常,大气压是从TYPE_PRESSURE传感器读取的。海平面的压力必须知道,通常可以从附近的机场数据库中检索到。如果未知,您可以使用PRESSURE_STANDARD_ATMOSPHERE作为近似值,但绝对高度并不准确。 若要计算高度差异,必须计算两点高度之间的差异。如果你不知道海平面的高度,你可以用PRESSURE_STANDARD_ATMOSPHERE代替,考虑到通常所涉及的压力范围,这会带来很好的结果。
所以您可以使用PRESSURE_STANDAR_ATMOSPERE,但是它的值不能是“正确”的值。我的建议是使用Google融合定位api,以获得更精确的值(主要来自GPS)。您可以检查您的手表是否有一个GPS内的代码,如果有,直接使用可穿戴位置API,或要求定位到您的手机否则。
发布于 2015-03-19 19:54:27
我现在在阿尔卑斯山的滑雪假期中,可以验证传感器的准确性和高度的计算。我使用了以下公式
sensorManager.getAltitude(SensorManager.PRESSURE_STANDARD_ATMOSPHERE, currentPressure)
- sensorManager.getAltitude(SensorManager.PRESSURE_STANDARD_ATMOSPHERE, calibrationPresure);这个很好用!准确度为+/-30m。起点在1200米左右,我上升到2700米。
我现在很自豪拥有一种新的高度计:-)
https://stackoverflow.com/questions/28792094
复制相似问题