ios传感器测试-急刹车动作模拟
2016-02-19 09:40
477 查看
几个关键值:THRESHOLD_MAX,THRESHOLD,THRESHOLD_MIN,mMotionManager.accelerometerUpdateInterval(更新周期),TIMES
刹车的反应快慢可根据上述值来调整。
同样逻辑安卓也可实现,上述关键值需调整。
private var mMotionManager: CMMotionManager!
private let THRESHOLD_MAX: Double = 1.0 //Android 20.0
private let THRESHOLD: Double = 0.1 //Android 4.0
private let THRESHOLD_MIN: Double = 0.1 //Android 1
private let TIMES = 5
//端末が実際に取得した加速度値。重力加速度も含まれる。This values include gravity force.
private var currentOrientationValues: [Double] = [ 0.0, 0.0, 0.0 ]
//ローパス、ハイパスフィルタ後の加速度値 Values after low pass and high pass filter
private var currentAccelerationValues: [Double] = [ 0.0, 0.0, 0.0 ]
//diff 差分
private var dx: Double = 0.0
private var dy: Double = 0.0
private var dz: Double = 0.0
private var vectorSize: Double = 0
private var vectorSize_max: Double = 0
private var counter: Int64 = 0
private var counted = false
private var noiseflg = true
func startSensor() {
// MotionManagerを生成.
mMotionManager = CMMotionManager()
// 更新周期设定,周期越短反应越快
mMotionManager.accelerometerUpdateInterval = 0.1
// 加速度の取得を開始.
mMotionManager.startAccelerometerUpdatesToQueue(NSOperationQueue.mainQueue(), withHandler: {(accelerometerData:CMAccelerometerData?, error: NSError?) -> Void in
let x = accelerometerData!.acceleration.x
let y = accelerometerData!.acceleration.y
let z = accelerometerData!.acceleration.z
/* ローパスフィルタで重力値を抽出(重力の影響だけが残る) */
self.currentOrientationValues[0] = x * 0.1 + self.currentOrientationValues[0] * (1.0 - 0.1)
self.currentOrientationValues[1] = y * 0.1 + self.currentOrientationValues[1] * (1.0 - 0.1)
self.currentOrientationValues[2] = z * 0.1 + self.currentOrientationValues[2] * (1.0 - 0.1)
/* ハイパスフィルタで重力値を省く(重力の影響が取り除かれる=瞬間的な加速度がわかる) */
self.currentAccelerationValues[0] = x - self.currentOrientationValues[0]
self.currentAccelerationValues[1] = y - self.currentOrientationValues[1]
self.currentAccelerationValues[2] = z - self.currentOrientationValues[2]
/* ベクトル値を求めるために差分を計算 */
self.dx = self.currentAccelerationValues[0]
self.dy = self.currentAccelerationValues[1]
self.dz = self.currentAccelerationValues[2]
/* ベクトル値計算 */
self.vectorSize = sqrt(Double(self.dx * self.dx + self.dy * self.dy + self.dz * self.dz))
if(self.noiseflg){
self.noiseflg = false
}
else{
if(self.vectorSize > self.THRESHOLD) {
if (self.counted) {
self.counter++
self.counted = false
if(self.vectorSize > self.vectorSize_max) {
self.vectorSize_max = self.vectorSize
}
}
else if(!self.counted){
self.counted = true
}
}
else if(self.vectorSize < self.THRESHOLD_MIN) {
if( (TIMES < self.counter) && (self.vectorSize_max > self.THRESHOLD_MAX) ) {
// 急刹车后处理
}
self.vectorSize_max = 0
self.counter = 0
}
}
})
}
刹车的反应快慢可根据上述值来调整。
同样逻辑安卓也可实现,上述关键值需调整。
private var mMotionManager: CMMotionManager!
private let THRESHOLD_MAX: Double = 1.0 //Android 20.0
private let THRESHOLD: Double = 0.1 //Android 4.0
private let THRESHOLD_MIN: Double = 0.1 //Android 1
private let TIMES = 5
//端末が実際に取得した加速度値。重力加速度も含まれる。This values include gravity force.
private var currentOrientationValues: [Double] = [ 0.0, 0.0, 0.0 ]
//ローパス、ハイパスフィルタ後の加速度値 Values after low pass and high pass filter
private var currentAccelerationValues: [Double] = [ 0.0, 0.0, 0.0 ]
//diff 差分
private var dx: Double = 0.0
private var dy: Double = 0.0
private var dz: Double = 0.0
private var vectorSize: Double = 0
private var vectorSize_max: Double = 0
private var counter: Int64 = 0
private var counted = false
private var noiseflg = true
func startSensor() {
// MotionManagerを生成.
mMotionManager = CMMotionManager()
// 更新周期设定,周期越短反应越快
mMotionManager.accelerometerUpdateInterval = 0.1
// 加速度の取得を開始.
mMotionManager.startAccelerometerUpdatesToQueue(NSOperationQueue.mainQueue(), withHandler: {(accelerometerData:CMAccelerometerData?, error: NSError?) -> Void in
let x = accelerometerData!.acceleration.x
let y = accelerometerData!.acceleration.y
let z = accelerometerData!.acceleration.z
/* ローパスフィルタで重力値を抽出(重力の影響だけが残る) */
self.currentOrientationValues[0] = x * 0.1 + self.currentOrientationValues[0] * (1.0 - 0.1)
self.currentOrientationValues[1] = y * 0.1 + self.currentOrientationValues[1] * (1.0 - 0.1)
self.currentOrientationValues[2] = z * 0.1 + self.currentOrientationValues[2] * (1.0 - 0.1)
/* ハイパスフィルタで重力値を省く(重力の影響が取り除かれる=瞬間的な加速度がわかる) */
self.currentAccelerationValues[0] = x - self.currentOrientationValues[0]
self.currentAccelerationValues[1] = y - self.currentOrientationValues[1]
self.currentAccelerationValues[2] = z - self.currentOrientationValues[2]
/* ベクトル値を求めるために差分を計算 */
self.dx = self.currentAccelerationValues[0]
self.dy = self.currentAccelerationValues[1]
self.dz = self.currentAccelerationValues[2]
/* ベクトル値計算 */
self.vectorSize = sqrt(Double(self.dx * self.dx + self.dy * self.dy + self.dz * self.dz))
if(self.noiseflg){
self.noiseflg = false
}
else{
if(self.vectorSize > self.THRESHOLD) {
if (self.counted) {
self.counter++
self.counted = false
if(self.vectorSize > self.vectorSize_max) {
self.vectorSize_max = self.vectorSize
}
}
else if(!self.counted){
self.counted = true
}
}
else if(self.vectorSize < self.THRESHOLD_MIN) {
if( (TIMES < self.counter) && (self.vectorSize_max > self.THRESHOLD_MAX) ) {
// 急刹车后处理
}
self.vectorSize_max = 0
self.counter = 0
}
}
})
}
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 讲解iOS开发中基本的定位功能实现
- js判断客户端是iOS还是Android等移动终端的方法
- iOS应用中UISearchDisplayController搜索效果的用法
- IOS开发环境windows化攻略
- 浅析iOS应用开发中线程间的通信与线程安全问题
- 检测iOS设备是否越狱的方法
- .net平台推送ios消息的实现方法
- 探讨Android与iOS,我们将何去何从?
- Android、iOS和Windows Phone中的推送技术详解
- iOS推送的那些事
- IOS 改变键盘颜色代码
- 举例详解iOS开发过程中的沙盒机制与文件
- Android和IOS的浏览器中检测是否安装某个客户端的方法