2016-10-14 7 views
7

मैं एक ऐसे ऐप पर काम कर रहा हूं जो कोरमोशन डेटा एकत्र करता है और मैं एक मौजूदा ऐप स्टोर एप्लिकेशन का उपयोग कर रहा हूं ताकि यह सुनिश्चित किया जा सके कि मैं सही ढंग से डेटा एकत्र कर रहा हूं।असामान्य कोरमोशन सेंसरफ्यूजन डेटा

अधिकांश भाग के लिए, सबकुछ बराबर है लेकिन मुझे कुछ परीक्षणों में कुछ अजीब डेटा दिखाई दे रहा है। समस्या रोल, पिच और यॉ मानों में दिखाई दे रही है, हालांकि, एक्सेलेरोमीटर, जीरोस्कोप और मैग्नेटोमीटर का कच्चा डेटा बराबर है ...

नीचे दिए गए चार्ट 5 डिवाइसों से एकत्रित डेटा को एक रिग पर प्लॉट करते हैं @ 100Hz:

  1. iPhone 5 (आईओएस 10.0.2)
  2. iPhone 5 (आईओएस 10.0.2)
  3. iPhone 5 (आईओएस 10.0.2)
  4. iPhone 5s (आईओएस 10.0.2)
  5. आईफोन 6 एस (आईओएस 10.0.2)

पहले, डेटा SensorLog से एकत्र: SensorLog Data दूसरा, डेटा मेरे ऐप से एकत्र: My App Data तीसरा, मेरे ऐप से एकत्र किए गए आंकड़ों लेकिन इस बार @ 10 हर्ट्ज: enter image description here

टिप्पणियों:

  • समस्या आईफोन 5 & 5s तक सीमित प्रतीत होती है अद्यतन: समस्या 6s में भी देखी गई है
  • सेंसरलॉग मूल्यों को सही ढंग से रिकॉर्ड करने में सक्षम है (हालांकि मैंने इसे 'खराब' डेटा उत्पन्न करने का एक उदाहरण देखा है) जो एक हार्डवेयर सीमा को समाप्त करने के लिए प्रतीत होता है (पिछले आईफोन 4 एस परीक्षण भी ठीक है)
  • iPhone 6s सभी परीक्षणों में ठीक प्रदर्शन अद्यतन: अब मामला
  • मेरा ऐप आवृत्ति से प्रभावित हो सकता के रूप में परिणाम बताते हैं कि @ 10 हर्ट्ज, 1 iPhone 5 ठीक है लेकिन @ 100Hz कोई भी
  • हैं कच्चे डेटा सभी उपकरणों के बराबर है, इसलिए यह स्पष्ट नहीं है कि कुछ डिवाइसों के लिए सेंसर फ़्यूज़न डेटा क्यों बंद है
  • Quaternions का उपयोग करते हुए समस्या के रूप में वे एक ही कच्चे डेटा
  • 'बुरे' कुछ मामलों में डेटा प्रकट होता है से प्राप्त कर रहे समाधान नहीं होता है अच्छा डेटा का पालन कर लेकिन आयाम रास्ता बहुत बड़ी के रूप में
नीचे बताया गया है

भूखंडों पर ज़ूम इन करना:

Zoomed Chart

और इसके बाद के संस्करण भूखंड पर रोल डेटा मैन्युअल रूप से बाहर फैला डालने:

Overlay roll

कोड:

func start(_ interval: TimeInterval = 0.1) { 
    self.interval = interval 

    logTimer = Timer.new(every: interval, { 
     self.motionData.currentRecord = self.motionDataRecord 
     self.motionData.createCoreDataRecord() 
     NotificationCenter.default.post(name: .motionHelperDidUpdateData, object: nil) 
    }) 
    logTimer.start() 

    startCoreLocation() 
    startAccelerometer() 
    startDeviceMotion() 
    startGyroscope() 
    startMagnetometer() 
} 

func startCoreLocation() { 
    switch CLLocationManager.authorizationStatus() { 
    case .authorizedAlways: 
     locationManager.startUpdatingLocation() 
     locationManager.startUpdatingHeading() 
    case .notDetermined: 
     locationManager.requestAlwaysAuthorization() 
    case .authorizedWhenInUse, .restricted, .denied: 
     delegate?.reRequestAlwaysAuthorization() 
    } 
} 

func startAccelerometer() { 
    if motionManager.isAccelerometerAvailable { 
     motionManager.accelerometerUpdateInterval = interval 
     motionManager.startAccelerometerUpdates(to: queue) { 
      [weak self] (data, error) in 

      guard let weakSelf = self else { return } 

      if error != nil { 
       print("Accelerometer Error: %@", error) 
      } 
      guard let data = data else { return } 

      weakSelf.motionDataRecord.accelerometer = data 
     } 
    } else { 
     print("The accelerometer is not available") 
    } 

} 

func startGyroscope() { 
    if motionManager.isGyroAvailable { 
     motionManager.gyroUpdateInterval = interval 
     motionManager.startGyroUpdates(to: queue) { 
      [weak self] (data, error) in 

      guard let weakSelf = self else { return } 

      if error != nil { 
       print("Gyroscope Error: %@", error) 
      } 
      guard let data = data else { return } 

      weakSelf.motionDataRecord.gyro = data 
     } 
    } else { 
     print("The gyroscope is not available") 
    } 
} 

func startMagnetometer() { 
    if motionManager.isMagnetometerAvailable { 
     motionManager.magnetometerUpdateInterval = interval 
     motionManager.startMagnetometerUpdates(to: queue) { 
      [weak self] (data, error) in 

      guard let weakSelf = self else { return } 

      if error != nil { 
       print("Magnetometer Error: %@", error) 
      } 
      guard let data = data else { return } 

      weakSelf.motionDataRecord.magnetometer = data 
     } 
    } else { 
     print("The magnetometer is not available") 
    } 
} 

func startDeviceMotion() { 
    if motionManager.isDeviceMotionAvailable { 
     motionManager.deviceMotionUpdateInterval = interval 
     motionManager.startDeviceMotionUpdates(using: attitudeReferenceFrame, to: queue) { 
      [weak self] (data, error) in 

      guard let weakSelf = self else { return } 

      if error != nil { 
       print("Device Motion Error: %@", error) 
      } 
      guard let data = data else { return } 

      weakSelf.motionDataRecord.deviceMotion = data 
     } 
    } else { 
     print("Device motion is not available") 
    } 
} 

वहाँ जिस तरह से मैं CoreMotion से डेटा एकत्र कर रहा हूँ के साथ एक समस्या है? क्या ऐसा करने का एक और अधिक प्रभावी तरीका है?

यहां क्या हो सकता है?

अद्यतन:

मैं एक नंगे हड्डियों एप्लिकेशन के रूप में इस प्रकार है और मैं इसी तरह के परिणाम हो रही है लिखा है: मैं क्या देख से

class ViewController: UIViewController { 

    @IBOutlet weak var startStop: UIButton! 

    var isRunning = false 

    let manager: CMMotionManager = { 
     let manager = CMMotionManager() 
     manager.deviceMotionUpdateInterval = 1/100 
     return manager 
    }() 

    @IBAction func handleStartStop(_ sender: AnyObject) { 
     if isRunning { 
      stopMotionUpdates() 
      startStop.setTitle("Start", for: .normal) 
     } else { 
      startMotionUpdates() 
      startStop.setTitle("Stop", for: .normal) 
     } 
     isRunning = !isRunning 
    } 

    func startMotionUpdates() { 
     manager.startDeviceMotionUpdates(using: .xTrueNorthZVertical, to: .main) { (data, error) in 
      print("Roll: \(data!.attitude.roll), Pitch: \(data!.attitude.pitch), Yaw: \(data!.attitude.yaw)") 
     } 
    } 

    func stopMotionUpdates() { 
     manager.stopDeviceMotionUpdates() 
    } 

} 

उत्तर

2

है कि ऐप 'सेंसर लॉग' आप उल्लेख किया गया है कि उनके डेटा को साफ करने के लिए कुछ और डेटा फ़िल्टर का उपयोग किया जा रहा है। क्योंकि उनका कोई तरीका नहीं है कि सेंसर संलयन डेटा के बाद ऐप द्वारा दिखाए गए अनुसार इतना साफ है।

आपके अवलोकन के अनुसार फोन सेंसर फ़्यूज़न बंद है। यह बंद नहीं हो सकता है क्योंकि यदि यह बंद है तो आपको पूरी तरह से कच्चा डेटा मिलेगा जो समझ में नहीं आता है या आपके आउटपुट के करीब भी है।

मैं जो सुझाव दे सकता हूं वह यह है कि आप एक्सेलेरोमीटर और मैग्नेटोमीटर की सहायता से जीरो डेटा की सफाई के लिए उपयोग किए जाने वाले फ़िल्टरों की खोज करते हैं। शायद अगर आप रोल, पिच, यॉ में रुचि रखते हैं। क्वाड-कॉप्टर को संतुलित करने के लिए उपयोग किए जाने वाले फ़िल्टर खोजें। वे आपकी मदद कर सकते हैं।

क्षमा करें यह कोई जवाब नहीं है, सिर्फ एक टिप्पणी है। लेकिन मेरे पास टिप्पणी करने के लिए बहुत प्रतिष्ठा नहीं है। तो, आप समझ सकते हैं।

संबंधित मुद्दे