Android Barometer海拔高度读数错误?

时间:2015-07-21 14:16:56

标签: java android geolocation altitude

我一直在努力实现一项功能,以便根据Android Galaxy S5手机的气压计传感器获得正确的海拔高度。唯一的问题是,我不认为这是准确的。根据我在特定位置的http://www.whatismyelevation.com,它显示我的海拔高度约为114米。但是,在我的手机上,根据气压计传感器显示它是210米。然而,我在一座高楼里,但我认为它不是100米高。

这是我的简单代码:

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.configure_settings);
    context = getApplicationContext();

    mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    sensors = mSensorManager.getSensorList(Sensor.TYPE_PRESSURE);

    if (sensors.size() > 0)
    {
        sensor = sensors.get(0);
        mSensorManager.registerListener(this, sensor,
                SensorManager.SENSOR_DELAY_NORMAL);
    }

}

@Override
public void onSensorChanged(SensorEvent event)
{
    float pressure = event.values[0];
    altitude = String.valueOf(SensorManager.getAltitude(
            SensorManager.PRESSURE_STANDARD_ATMOSPHERE, pressure));

}

谢谢!

3 个答案:

答案 0 :(得分:4)

首先:气压计非常精确,但不准确。如果您将10台Android手机彼此相邻放置在桌面上,您可以发现设备之间的气压差异高达3 mb。这是一个错误来源。

第二:不同的群体将定义海拔高度'不同,所以请确保您使用相同的定义。例如,在Location类中,getAltitude定义为

  

获取高度(如果可用),以WGS 84参考椭球上方的米为单位。

http://developer.android.com/reference/android/location/Location.html#getAltitude()

第三,天气将影响气压计的读数高达40 mb。如果您想从晴雨表获得更准确的高度读数,您将不得不偏离当前的天气。大气可以将局部压力改变到每小时1-2毫巴(在极端情况下)

第四:使用智能手机中的晴雨表尚无法获得完全准确的高度读数。目前还没有人解决这个问题 - 例如,单独的晴雨表不足以实现楼层检测。

顺便说一句,我是PressureNet的开发人员 - 我从智能手机上收集了超过20亿的压力读数,我每天都会看到所有这些类型的错误。

结束时:如果你想达到海拔高度的值,气压计给你的读数需要在使用前进行重要的解释。从每个气压计读取的每个值都是错误的'默认情况下;你必须做一些具体的工作才能让它适合你,具体取决于你的确切需求。

github.com/cbsoftware/pressurenet

答案 1 :(得分:2)

智能手机型设备的气压传感器的绝对精度非常差。即静止时,读取的值可能会与从其他来源读取的值不相等。

但是,它非常擅长测量气压的变化。因此,如果您在某个高度读取气压,然后迅速移至另一高度,您将获得相当准确的高度差测量值(前提是您使用正确的高度公式,例如https://physics.stackexchange.com/questions/333475/how-to-calculate-altitude-from-current-temperature-and-pressure

即如果您知道某个位置的绝对海拔高度,则可以为另一位置计算一个相当准确的值。

重要的是要记住,由于天气变化,任何位置的气压都是可变的。在多风的环境中,除非进行时间平均或对值进行低通滤波,否则通常会发现值的准确性较低。

当涉及Google,GPS或其他来源提供的海拔高度值时,它们通常将某个位置的海拔高度表示为理想的地球表面形状。这种形状通常称为大地水准面(大致类似于地球实际形状的椭球形)。在大多数地方,地球的实际表面(陆地或海洋)的形状确实与理想的大地水准面有所不同。对于在最后一次冰河期被厚厚的冰层覆盖的地区,土地可能仍低于大地水准面以下30-50米。在此处找到更多详细信息:https://www.esri.com/news/arcuser/0703/geoid1of3.html

出于法线贴图的目的,将海拔高度引用为某种形式的常数。当在LAT(最低天文潮)靠近海海拔== 0时,因此传统上将海拔高度的本地参考参考为该水平。也使用其他更“现代”的参考。 Google,基于卫星的全球定位系统等未使用此参考,因此从它们那里获得的海拔高度与在本地计算(或读取地图)的海拔高度通常不匹配。

答案 2 :(得分:0)

与气象站压力传感器/算法相比,这只是三星S7智能手机上Android 8.1的报告。

CREATE TRIGGER tr_Ins_Passenger
BEFORE INSERT ON SeatBooking
FOR EACH ROW EXECUTE PROCEDURE create_SeatBooking();

CREATE OR REPLACE FUNCTION create_SeatBooking()
RETURNS TRIGGER AS
$BODY$
  BEGIN
    SELECT fb.BookingID, fb.NumSeats
    FROM FlightBooking AS fb
    INNER JOIN SeatBooking AS sb ON fb.BookingID = NEW.BookingID
    INNER JOIN Passenger AS p ON p.PassengerID = NEW.PassengerID;

    IF ((SELECT COUNT(BookingID) FROM SeatBooking WHERE fb.BookingID = NEW.BookingID) > fb.NumSeats)
    THEN ROLLBACK;
    END IF;
    RETURN NEW;
  END;
$BODY$
LANGUAGE plpgsql;

INSERT INTO SeatBooking VALUES(10005, 40015, 29);

与两个值(990毫巴)的算术平均值相差大约+/- 2%。

但是,GPS的高度误差极限约为3%。在大约5分钟的时间范围内,消费级GPS报告的附近山顶上的海拔高度通常在大约1080英尺至1150英尺之间,孤立的读数低于或高于这些读数。算术平均值为1115ft,下限值和上限值约为1115ft值的+/- 3%。国家大地测量地图显示山顶的官方海拔为1110英尺,非常接近这两个值的平均值。