मैं एक ऐसे ऐप पर काम कर रहा हूं जो कोरमोशन डेटा एकत्र करता है और मैं एक मौजूदा ऐप स्टोर एप्लिकेशन का उपयोग कर रहा हूं ताकि यह सुनिश्चित किया जा सके कि मैं सही ढंग से डेटा एकत्र कर रहा हूं।असामान्य कोरमोशन सेंसरफ्यूजन डेटा
अधिकांश भाग के लिए, सबकुछ बराबर है लेकिन मुझे कुछ परीक्षणों में कुछ अजीब डेटा दिखाई दे रहा है। समस्या रोल, पिच और यॉ मानों में दिखाई दे रही है, हालांकि, एक्सेलेरोमीटर, जीरोस्कोप और मैग्नेटोमीटर का कच्चा डेटा बराबर है ...
नीचे दिए गए चार्ट 5 डिवाइसों से एकत्रित डेटा को एक रिग पर प्लॉट करते हैं @ 100Hz:
- iPhone 5 (आईओएस 10.0.2)
- iPhone 5 (आईओएस 10.0.2)
- iPhone 5 (आईओएस 10.0.2)
- iPhone 5s (आईओएस 10.0.2)
- आईफोन 6 एस (आईओएस 10.0.2)
पहले, डेटा SensorLog से एकत्र: दूसरा, डेटा मेरे ऐप से एकत्र: तीसरा, मेरे ऐप से एकत्र किए गए आंकड़ों लेकिन इस बार @ 10 हर्ट्ज:
टिप्पणियों:
- समस्या आईफोन 5 & 5s तक सीमित प्रतीत होती है अद्यतन: समस्या 6s में भी देखी गई है
- सेंसरलॉग मूल्यों को सही ढंग से रिकॉर्ड करने में सक्षम है (हालांकि मैंने इसे 'खराब' डेटा उत्पन्न करने का एक उदाहरण देखा है) जो एक हार्डवेयर सीमा को समाप्त करने के लिए प्रतीत होता है (पिछले आईफोन 4 एस परीक्षण भी ठीक है)
- iPhone 6s सभी परीक्षणों में ठीक प्रदर्शन अद्यतन: अब मामला
- मेरा ऐप आवृत्ति से प्रभावित हो सकता के रूप में परिणाम बताते हैं कि @ 10 हर्ट्ज, 1 iPhone 5 ठीक है लेकिन @ 100Hz कोई भी
- हैं कच्चे डेटा सभी उपकरणों के बराबर है, इसलिए यह स्पष्ट नहीं है कि कुछ डिवाइसों के लिए सेंसर फ़्यूज़न डेटा क्यों बंद है
- Quaternions का उपयोग करते हुए समस्या के रूप में वे एक ही कच्चे डेटा
- 'बुरे' कुछ मामलों में डेटा प्रकट होता है से प्राप्त कर रहे समाधान नहीं होता है अच्छा डेटा का पालन कर लेकिन आयाम रास्ता बहुत बड़ी के रूप में
भूखंडों पर ज़ूम इन करना:
और इसके बाद के संस्करण भूखंड पर रोल डेटा मैन्युअल रूप से बाहर फैला डालने:
कोड:
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()
}
}