Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iOS Motion Detection: Motion Detection Sensitivity Levels

I have a simple question. I'm trying to detect when a user shakes the iPhone. I have the standard code in place to detect the motion and this works no problem. However, in testing this on my actual phone, I've realized that you have to shake the device quite hard to get the motion detection to trigger. I would like to know if there is a way to implement a level of sensitivity checking. For example, a way to detect if a user lightly shakes the device or somewhere between light and hard shake. This will be targeted towards iOS 7 so any tips or advice that is not deprecated from older iOS version would be greatly appreciated. I've done my googling but have yet to find any good solutions to this problem (If there are any.)

Thanks!

-(void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
    if(motion == UIEventSubtypeMotionShake)
    {
       //Detected motion, do something about it 
       //at this point.
    }
}

-(BOOL)canBecomeFirstResponder
{
    return YES;
}

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self becomeFirstResponder];
}

-(void)viewWillDisappear:(BOOL)animated
{
    [self resignFirstResponder];
    [super viewWillDisappear:animated];
}
like image 459
zic10 Avatar asked Oct 02 '13 07:10

zic10


People also ask

What is sensitivity in motion detection?

There are 3 sensitivity levels of motion detection. High - The camera records videos when it detects a small motion, such as yawning or stretching. Medium (default) - The camera records videos when it detects a normal daily motion, such as people walking around the house.

What does higher sensitivity mean in motion analysis configuration?

Sensitivity determines how sensitive the camera is to motion. For example, if the sensitivity is high, small amounts of motion are more likely to trigger an event.

What does sensitivity level mean?

The sensitivity level is defined as the proportion of the respondents in the population bearing the sensitive attribute A given a truthful answer under direct question method.


1 Answers

Heres how I did this using Swift 3.

Import CoreMotion and create an instance

import CoreMotion
let motionManager = CMMotionManager()

On ViewDidLoad or wherever you want to start checking for updates:

 motionManager.startDeviceMotionUpdates(to: OperationQueue.current!, withHandler:{
            deviceManager, error in
            if(error == nil){
                if let mgr = deviceManager{
                    self.handleMotion(rate: mgr.rotationRate)
                }
            }
        })

This function takes the rotation rate and gets a sum for the absolute values for x,y and z movements

  func handleMotion(rate: CMRotationRate){
        let totalRotation = abs(rate.x) + abs(rate.y) + abs(rate.z)

        if(totalRotation > 20) {//Play around with the number 20 to find the optimal level for your case
            start()
        }else{
       print(totalRotation)
        }
    }

func start(){

//The function you want to trigger when the device is rotated

}
like image 168
JP Aquino Avatar answered Nov 08 '22 22:11

JP Aquino