哈工大计算机科学与技术学院软件基础教研室 Android = 人 + 计算 普适环境 授课教师:李治军 综合楼 417 室 第 8 讲 Android 定位与节能 Lecture 8: Android Location and Energy
- 2 - Android & Pervasive Computing 有了 Location 以后,我们还需要 ? 应用 Location 做点什么 ? 地图标注,地图导航,智能交通, Place-its… 功能有了,性能同样重要 … 节能、稳定、安全 对目前的智能手机而言,节能是最为重要的指标 … GPS 是显著的手 机能耗模块 ! 不用 GPS 可以定 位吗 ?
- 3 - Android & Pervasive Computing Android 如何记录电能的消耗 ? Android 用 Intent 告诉上层很多事 … public class BatteryReceiver extends BroadcastReceiver { public int batLevel; public int batScale; public void onReceive(Context context, Intent intent) { Toast.makeText(context, "BatteryReceiver", Toast.LENGTH_SHORT).show(); } 需要让系统知道我们在 Receiver 电池电量 …… 测量是许多工 作的起点 …… 不好使,据说电池电量监 听,只能在代码中注册
- 4 - Android & Pervasive Computing 也可以用程序来注册 Receiver 在 Android 中, XML 和程序可实现同样功能 … public class BatteryTestActivity extends Activity { public void onCreate() { BatteryReceiver mBatteryReceiver = new BatteryReceiver(); this.registerReceiver(mBatteryReceiver,new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 这就是 receive 到以 后的那个 Toast
- 5 - Android & Pervasive Computing BatteryReceiver 接收到了什么 ? BroadcastReceiver 中最重要的函数 ? public void onReceive(Context context, Intent intent) { String action=intent.getAction(); if(action.equals(Intent.ACTION_BATTERY_CHANGED)){ batLevel=intent.getIntExtra("level", 0); batScale=intent.getIntExtra("scale", 100); } batLevel*100/batScale 剩余多少电量 String.valueOf(batLevel*100/batScale) "status" "voltage" "temperature"
- 6 - Android & Pervasive Computing 相对坐标定位 相对于若干已知位置的距离 三点定位 相对坐标位置 Cell ID 技术 : 移动终端所处的蜂窝小区 ID 是 Cell ID 常见技术 WPS(Wifi Position System): 根 据可见 Access Point 求出一个位置 基本思想是应用一些参考位置 …
- 7 - Android & Pervasive Computing 大多数时候都是优缺点并存 所以更为实用的方式是针对应用需求和特征进行 自适应调整 …… 相对坐标定位虽然节能,但其精度不高
- 8 - Android & Pervasive Computing 可以自适应的调整 GPS 采样速率 … 满足应用对精度的要求下,适当的时候关闭 GPS , 这样可以节能 … 使用 accelerometer 可以估计用户是否移动 静止的时候就不需要 打开 GPS 了 第一件事 : 读取加速度传 感器 第二件事 : 自动打开和关 闭 GPS
- 9 - Android & Pervasive Computing 如何读取 accelerometer 数值 ? SensorManager 对手机上的传感器统一管理 让我们的 Activity 成为接收 Sensor 数据的 Listener public class MyActivity extends Activity implements SensorEventListener{ private SensorManager senMgr; public void onCreate(...) { senMgr=getSystemService(SENSOR_SERVICE);} protected void onResume(){ sensors=senMgr.getSensorList(Sensor.TYPE_ALL) for(Sensor s:sensors){ TextView tv; tv.setText(s.getName()); TYPE_ACCELEROM ETER
Android & Pervasive Computing 具体实现 accelerometer 数值的读取 加速度传感器 Linux Android SensorEventListener MyActivity SensorManager 让 MyActivity 侦听 SensorEvent? protected void onResume(){ senMgr.registerListener(this, SensorManager.SENSOR_ACCELEROMETER, SensorManager.SENSOR_DELAY_GAME); } private float[] sampleX = new float[100];... public void onSensorChanged(int sensor, float[] values) { sampleX[pos++] = values[0];... MyActivity 传感器产生数据以后就会回调 MyActivity 的某函数 ?
Android & Pervasive Computing 接下来的工作就是一个小算法 … 对 sampleX 数组进行处理 … 一个直观想法 : 如果最近一段时间加速度变化很小 定义一个 W 时间窗口,记录 W 内加速度 值超过阈值 T 的比例,如果比例超过 public int TotalAcceByondT; if(abs(sampleX[pos]) > T) TotalAcceByondT ++; if(abs(sampleX[pos-W]) > T) TotalAcceByondT --; if(TotalAcceByondT/W > ) …
Android & Pervasive Computing 在程序中打开和关闭 GPS 想一想应该仍然是那个 LocationManager… locationManager.setTestProviderEnabled(Contex t.LOCATION_SERVICE, false); 同样,将 WiFi 打开、关闭也很简单 wifiManager = (WifiManager) this.getSystemSer vice(Context.WIFI_SERVICE); wifiManager.setWifiEnabled(false); //wifiManager.setWifiEnabled(true); 仍然是 : 有了 Android 提供的那些 Manager ,应用 编程很容易
Android & Pervasive Computing Wifi 可以帮助我们实现定位 : WPS Wifi 如何实现定位 ? 将一个可见的 Access Point 列表转化成一个位置 (1) 从 Radio beacons 那里 获得信息 (beacon 的 ID) (2) 有一个保存 beacons 位 置信息的 databases (3) 定位 收到 SSID ,说明在 通信半径内
Android & Pervasive Computing 获取 Wifi Beacon 的位置 得到 Wifi 信号的强度、名字等 ? WifiManager wifiManager = (WifiManager)getSystemService(WIFI_SERVICE); WifiInfo wifiInfo = wifiManager.getConnectionInfo(); wifiInfo.getSSID(); // 得到 SSID 号, 相当于名字 wifiinfo.getRssi(); // 获取 RSSI, 接受信号强度指示 WifiManager RSSI = - (10nlog 10 d + A) 实际结果 : 干扰,多径
Android & Pervasive Computing 获取能扫描到的一堆 Wifi Beacons 应该仍然是 WifiManager… wifiReceiver = new WifiReceiver(); registerReceiver(wifiReceiver, new IntentFilter( WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); wifiManager.startScan(); class WifiReceiver extends BroadcastReceiver { public void onReceive() { wifiList = wifiManager.getScanResults(); 有 startScan() 函数
Android & Pervasive Computing 不用 GPS 、 WPS ,照样可以定位 … 人群中有些人知道位置,这些点称为锚点,和锚 点的距离可以用通信 ( 蓝牙 ) 测量获得 X(:, i, t) 是节点 i 的位置向量 A(:, a, t) 是锚点 a 的位置向量 D ij (t) = ||X(:, i, t) − X(:, j, t)|| 2 2 ( 欧氏距离的平方 ) C ia (t) = ||X(:, i, t) − A(:, a, t)|| 2 2 lb(ub) 下 ( 上 ) 界 ; eq 均值, 这些距 离就用 RSSI 测量得出 有 D ij lb (t) 、 D ij ub (t) 、 D ij eq (t) 和 C ia lb (t) 、 C ia ub (t) 、 C ia eq (t) 等测量值 Crowd 计算 + 数学 …
Android & Pervasive Computing 定位变成了一个纯粹的数学问题 已知 A(:, a, t) ,求 X(:, i, t) 使得下面的 f(X,t) 最小 f(X,t) = ij (D ij (t)-D ij eq (t)) 2 + ij min{0, D ij (t)-D ij lb (t)} 2 + ij max{0, D ij (t)-D ij ub (t)} 2 + ia (C ia (t)-C ia eq (t)) 2 + ia min{0, C ia (t)-C ia lb (t)} 2 + ia max{0, C ia (t)-C ia ub (t)} 2 f(X,t) 是我们定位 结果的误差 数学的智慧就是应用智慧来发现和利用自然规律
Android & Pervasive Computing 需要利用一些人移动的统计规律 人的移动是有规律的 … 定义一个坐标矩阵 : M[2n, t max ] n 节点数, t max 观测时间 M(i, t) 和 M(i+n, t) 是 t 时刻节点 i 的 x 坐标和 y 坐标 如果节点匀速运动 : M(:, t) = z + t v M 的秩 (rank)=2 节点不总匀速,但往往是匀 速移动一段时间变到另一个 速度,在匀速移动一段时间 s i 是特征值 i=1 K s i 2 si2si2
Android & Pervasive Computing 人的移动在时间上有连续性 上面给出的特征称为 low rank ,还有一个规律是 Temporal stability 定义一个 NVC(normalized velocity change) ||v(i,t) – v(i,t-1)|| 2 mean i,t ||v(i,t)|| 2 大于 50% 的 t 其 NVC=0 仍然是匀速运动
Android & Pervasive Computing 带入规律让数学模型更趋近于真实 定位的结果应该和节点移动特征相吻合 X(:, i, t) 是否满足 temporal stability constraints? g(X) = k,i,t (X(k,i,t-1) + X(k,i,t+1) – 2X(k,i,t)) 2 X(:, i, t) 是否满足 low-rank constraints? h(X,U,V) = ||M - U V T || 2 2 M 是由 X 写成的, U 和 V 是矩阵 M 的分解,其中 U 是一个 N*r 的矩阵,V 是 一个 t max *r 的矩阵 已知 A(:, a, t) 求 X(:, i, t) 使得 下面的惩罚函数最小 min C = t f(X,t) + g(X) + h(X,U,V)
Android & Pervasive Computing 数学模型 + 数学工具 … 开始求解这个优化问题 基本思想 : 从一个 X(:, i, t) 初值开始,通过迭代找到极 大值 ( 或最大值 ) ,著名的方法有梯度下降法等 可以采用的 Newton’s method( 牛顿迭代法 ) 无约束最优化问题 i+1 = i – f( i )/f ( i ) 就是 X
Android & Pervasive Computing Lecture 8 总结 定位需要充分考虑节能 Android 电池监控 WiFi 定位 Wifi AP 扫描,测 SSID ,测 RSSI ,测 CellID… 锚点定位 Crowd 计算 + 数学