一 : Android平台上使用气压传感器计算海拔高度
气压传感器两年前已经开始被手机制造商运用在其设备上,但貌似没有引起开发者足够的重视。像Galaxy S III 、Galaxy Note 2和小米2手机上都有,不过大家对于气压传感器比较陌生。其实大气压无处不在,我们可以利用它来为我们完成诸如海拔高度测量甚至是空间定位的任务。
“www.61k.com。先说些题外话,舒缓一下工作学习的疲惫。前些天跟朋友一起去户外活动,登山到半山腰,突然朋友问我,现在海拔大概多少?我脑子灵光一闪,前些天一个在小米工作的朋友在其小米2手机上打开指南针应用对我说现在海拔多少多少,而我现在手头正有一台小米4手机,赶紧拿出来打开指南针应用,结果气压是出来了,海拔计算却需要联网,真是让人扫兴。也正是这一点让我萌生了自己来计算的想法。
既然说做,那就做吧,反正应该不会太难。首先网上查询相关资料,计算自己的海拔高度通常有两种方法,一是通过GPS全球定位系统,二是通过测出大气压,然后根据气压值计算出海拔高度。
使用GPS全球定位系统获取海拔简单是简单,只要获取到Android系统提供LoctionManager服务,将提供者设置为LocationManager.GPS_PROVIDER,在写个GPS状态监听器GpsStatus.Listener,最后在实现一个LocationListener来实时监听位置的变化,在onLocationChanged回调函数中取出location参数,里面就包含了海拔高度值(getAltitude())。
关键代码如下
private LocationManager lm;
lm = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
if(!lm.isProviderEnabled(LocationManager.GPS_PROVIDER)){
Log.i(TAG, "请先开启GPS");
showAlertDialog(context, "开启GPS,定位更准确;取消则使用网络定位,粗略定位");
}
if(!lm.isProviderEnabled(LocationManager.GPS_PROVIDER)){
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
context.startActivity(intent);
}
lm.addGpsStatusListener(listener);
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, locationListener);
其中listener和locationListener分别为StatusListener和LocationListener的实例,使用起来也不难,主要代码框架已经为你生成了,只要查查android SDK的API就会明白的,就不说了。这种方式去测海拔,需要接收GPS信号。如果你在丛林或者洞穴或建筑物内,极有可能是接收不到GPS卫星信号的。这时候,可以考虑使用压力传感器来测海拔高度。
先说说使用压力传感器来测海拔高度的原理,其实非常简单,一些基本原理你必须要明白的:一般来说海拔越高,气压越低,他们之间存在某种关系,下文会讲到的。有不少学者对海拔与气压做了研究,回归了不少海拔与气压的数据,他们的变化关系大概服从下面的表达式。
因为我们要计算海拔(A),所以略作变化,可以知道A的计算公式如下。
其中P为当前的大气压,P0为标准大气压。这样,我们只要获取Android手机内置气压传感器的值,就可以初步估算出海拔高度了。实现起来也不难,关键代码如下。
private SensorManager sensorManager = null;
sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
mPressure = sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE);
if(mPressure == null)
{
mPressureVal.setText("您的手机不支持气压传感器,无法使用本软件功能.");
return;
}
mAccelerate = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
然后在onResume()函数里面注册气压传感器,在onPause()中注销,这样做当然是为了节约用电嘛。
sensorManager.registerListener(pressureListener, mPressure,
SensorManager.SENSOR_DELAY_NORMAL);
if(pressureListener!=null){
sensorManager.unregisterListener(pressureListener);
}
还有一点必须获取气压传感器的值嘛,必须要有一个SensorEventListener对象(SensorManager注册语句的pressureListener),代码很简单。
SensorEventListener pressureListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
float sPV = event.values[0];
mPressureVal.setText(String.valueOf(sPV));
DecimalFormat df = new DecimalFormat("0.00");
df.getRoundingMode();
// 计算海拔
double height = 44330000*(1-(Math.pow((Double.parseDouble(df.format(sPV))/1013.25),
(float)1.0/5255.0)));
mAltitude.setText(df.format(height));
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
};
海拔计算公式的实现自然也不是难事,基本上是翻译一下就出来了。
其实海拔和气压的这种关系比较复杂,受多方面的因素影响,最为显著的是温度的影响。大气压通俗来讲是大气对其他物体的压力,与空气分子的密度和动能相关,所以同一海拔高度,温度越高,气压越高。正是因为这个影响因素,使得气压测海拔有较明显的误差。如果是时隔不久,即温度变化不大,测高度差还是比较准确的,我做过实验,利用气压能较为准确的测出7层楼的高度,哈哈,是不是感觉很灵敏呢?只是影响因素带来的误差还得想办法消除。刚接触Android不久,也没写过什么博客,这个纯属扯扯,没什么技术难度,仅仅是为了总结一下android开发的一些事儿,顺便练练笔而已。
更多Android相关信息见Android专题页面
二 : 海拔高度大气压对照表61
泵制造厂只能给出Hs值,而不能直接给出Hg值。因为每台泵使用条件不同,吸入管路的布置情况也各异,有不同的
和
值,所以,只能由使用单
位根据吸入管路具体的布置情况,由计算确定Hg。
在泵样本或说明书中所给出的Hs是指大气压为10mH2O,水温为20℃状态下的数值。如果泵的使用条件与该状态不同时,则应把样本上所给出的Hs值,换算成操作条件下的Hs’值,其换算公式为
Hs’=Hs+(Ha-10)-(Hv-0.24) (2-11)
式中 Hs—操作条件下输送水时允许吸上真空高度,mH2O;
Hs—泵样本中给出的允许吸上真空高度,mH2O;
Ha—泵工作处的大气压,mH2O;
Hv—泵工作温度下水的饱和蒸汽压,mH2O;
0.24—水的饱和蒸汽压,mH2O。
泵安装地点的海拔越高,大气压力就越低,允许吸上真空高度就越小。若输送液体的温度越高,所对应的饱和蒸汽压就越高,这时,泵的允许吸上真空高度也就越小。不同海拔高度时大气压力值如表2-1所示。
表2-1不同海拔高度的大气压力
2.汽蚀余量
汽蚀余量Δh是指离心泵入口处,液体的静压头 与动压头 之和超过液体在操作温度下的饱和蒸汽压头pv/pg的某一最小指定值,即
此式中 —汽蚀余量,m; (2-12)
pv—操作温度下液体饱和蒸汽压,N/m2。
将式(2-9)与(2-12)合并可导出汽蚀余量
关系为
与允许安装高度Hg之间
(2-13) 式中p0为液面上方的压力,若为敞口液面则p0=pa。
应当注意,泵性能表上的
值也是按输送20℃水而规定的。当输送其它液体时,需进行校正。具体校正方法可参阅有关文献[14]。
由上可知,只要已知允许吸上真空高Hs与汽蚀余量 中的任一个参数,均可确定泵的安装高度。
例2-2 某台离心泵从样本上查得允许吸上真空高度Hs=6m,现将该泵安装在海拔高度为500m处,若夏季平均水温为40℃。问修正后的Hs’应为多少?若吸入管路的压头损失为1mH2O,泵入口处动压头为0.2mH2O。问该泵安装在离水面5m高度处是否合适?
解 当水温为40℃时,Hv=0.75m。由表(2-1)查得Ha=9.74m。根据式(2-11),则
Hs’=Hs+(Ha-10)-(Hv-0.24)
=6+(9.74-10)+(0.75-0.24) =5.23m
根据式(2-10)泵的安装高度为
Hs=Hs’-
- ΣHf
=5.23-0.2-1
=4.93m<5m
三 : 14全国各地海拔高度及大气压
全国各地主要城市海拔高度及大气压参考数据
序号 1 2 3 1 2 3 1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6 7 8 9 10 11
地名 北京 北京 密云 天津 蓟县 河北省 石家庄
海拔高度
m
大气压 KPa
最热均 温度℃
序号
地名 吉林省
海拔高度
m
大气压 KPa
最热均 温度℃
长春延庆通榆
4
吉林四平天津延吉塘沽黑龙江省
1
通化哈尔滨爱辉承德伊春张家界齐齐哈尔唐山 保定 邢台 山西省
鹤岗佳木斯
8
安达鸡西太原牡丹江大同绥芬河阳泉上海
介休上海阳城崇明内蒙古自治区
江苏省
运城金山呼和浩特南京海拉尔连云港锡林浩特徐州通辽南通辽宁省 沈阳 开原
浙江省
二连浩特淮阴赤峰武进杭州舟山阜新宁波抚顺金华本溪温州锦州台湾省 鞍山
朝阳衡州台北营口花莲丹东恒春大连
1
2 3 4 5 6 7 1 2 3 4 5 6 7 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6
毫县 六安
安阳三门峡蚌埠新乡芜湖开封安庆洛阳福建省
8
屯溪商丘福州平顶山南平驻马店上杭湖南省 厦门 江西省 南昌 景德镇
许昌建阳南阳永安信阳漳州长沙
3
岳阳常德株洲九江芷江德兴衡阳上饶零陵吉安 山东省 济南 烟台 德州 莱阳
广东省
2
邵阳萍乡郴州赣州广州韶关汕头阳江湛江海口
淄博西沙潍坊广西壮族自治区 青岛 荷泽 临沂 湖北省 武汉 光化 荆州
南宁桂林
4
柳州百色梧州
北海宜昌重庆
重庆
恩施万州黄石
2
1
香港
香港
2 3 4 5 6 7 8 1 2 3 4 5 6 7 1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6 7
遵义甘孜思南广元毕节南充威宁宜宾独山青海省 云南省
2
安顺西昌兴仁西宁格尔木昆明都兰昭通共和丽江玛多蒙自宁夏回族自治区
腾冲玉树思茅银川景洪石嘴山西藏自治区
3
吴忠拉萨盐池索县中卫新疆维吾尔自治区 昌都那曲固原
林芝乌鲁木齐日喀则阿勒泰陕西省
3
克拉玛依西安伊宁榆林吐鲁番延安哈密宝鸡喀什安康 甘肃省
兰州 敦煌 酒泉 山丹 平凉 天水 武都
汉中和田3
四 : 中国各省海拔高度、气压、气温表
海拔高度也称绝对高度,就是某地与海平面的高度差,通常以平均海平面做标准来计算,是表示地面某个地点高出海平面的垂直距离。海拔的起点叫海拔零点或水准零点是某一滨海地点的平均海水面。它是根据当地测潮站的多年记录,把海水面的位置加以平均而得出的。61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1