Neigung des iPhones

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Neigung des iPhones

    Hallo,

    ich hab schon wieder ein Problem.
    Ich will analog zu "Pokemon GO" den Inhalt der App ausblenden, wenn das Geräte einen bestimmten Neigungswinkel erreicht hat.
    z.B. wenn es liegt oder kopfüber um den Hals hängt.

    Ich habe mich dem Thema mit dem CMMotionManager genähert. Ich habe hier mein Code mit acceleration, rotationRate und magneticField habe ich auch schon versucht:

    Quellcode

    1. import SwiftUI
    2. import CoreMotion
    3. class Inclinometer: ObservableObject {
    4. private var motionManager: CMMotionManager
    5. @Published var x: Double = 0.0
    6. @Published var y: Double = 0.0
    7. @Published var z: Double = 0.0
    8. init() {
    9. motionManager = CMMotionManager()
    10. motionManager.accelerometerUpdateInterval = 0.5
    11. motionManager.startAccelerometerUpdates(to: .main) { (data, error) in
    12. guard error == nil else {
    13. print(error!)
    14. return
    15. }
    16. if let data {
    17. self.x = data.acceleration.x
    18. self.y = data.acceleration.y
    19. self.z = data.acceleration.z
    20. }
    21. }
    22. }
    23. }
    Alles anzeigen
    Mein Ergebnis bleibt aber immer das gleich, wenn das Gerät auf dem Kopf steht, wir der gleich Z-Wert geliefert, wie wenn es korrekt gehalten wird.
    Wie kann ich nun feststellen, wann das Gerät verkehrtherum gehalten wird?

    Ich hoffe Ihr habt noch eine Idee.
  • Heruhaundo schrieb:


    Mein Ergebnis bleibt aber immer das gleich, wenn das Gerät auf dem Kopf steht, wir der gleich Z-Wert geliefert, wie wenn es korrekt gehalten wird.
    Wie kann ich nun feststellen, wann das Gerät verkehrtherum gehalten wird?
    Hast du dir mal die einzelnen Neigungs - / Drehungswerte ausgeben lassen um nachzuvollziehen wie das iPhone die Neigung auswertet?

    Das iPhone wird wohl bei +/- 0 in der Neigung starten.
    Wie kannst du jetzt auswerten, dass der Neigungswinkel auf dem Kopf steht? Naja, du verfolgst die Neigungsbewegung bis zu Winkel -180 (oder -170 / -160). Und sobald du diesen Winkel erreicht hast, blendest du den Inhalt aus / cancelst den Inhalt.

    Wie genau das funktioniert kann ich dir nicht sagen - die Doku hilft dir aber sicherlich weiter.
    CMMotionManager Doku
  • Du wertest aktuell auch die acceleration aus, also die Beschleunigung des Geräts... Du willst ja aber eigentlich nciht die Beschleunigung, sondern die Rotation haben.

    Da verweise ich gerne auf die CMMotionManager Doku, die sagt..


    Apple schrieb:


    Use a CMMotionManager object to start the services that report movement detected by the device's onboard sensors. Use this object to receive four types of motion data:
    • Accelerometer data, indicating the instantaneous acceleration of the device in three dimensional space.
    • Gyroscope data, indicating the instantaneous rotation around the device's three primary axes.
    • Magnetometer data, indicating the device's orientation relative to Earth's magnetic field.
    • Device-motion data, indicating key motion-related attributes such as the device's user-initiated acceleration, its attitude, rotation rates, orientation relative to calibrated magnetic fields, and orientation relative to gravity. This data is provided by Core Motion’s sensor fusion algorithms.

  • Wolf schrieb:

    Warum frägst du nicht einfach die Orientation ab?
    Ich will den Inhalt des iPhones ausblenden, sobald eine gewisse Neigung erreicht ist, z.B. wenn es flach auf dem Tisch liegt.
    Das funktioniert soweit auch, aber wenn ich es weiter neige, wird der Inhalt wieder eingeblendet.
  • ashtari schrieb:

    Du wertest aktuell auch die acceleration aus, also die Beschleunigung des Geräts... Du willst ja aber eigentlich nciht die Beschleunigung, sondern die Rotation haben.

    Da verweise ich gerne auf die CMMotionManager Doku, die sagt..


    Apple schrieb:

    Use a CMMotionManager object to start the services that report movement detected by the device's onboard sensors. Use this object to receive four types of motion data:
    • Accelerometer data, indicating the instantaneous acceleration of the device in three dimensional space.
    • Gyroscope data, indicating the instantaneous rotation around the device's three primary axes.
    • Magnetometer data, indicating the device's orientation relative to Earth's magnetic field.
    • Device-motion data, indicating key motion-related attributes such as the device's user-initiated acceleration, its attitude, rotation rates, orientation relative to calibrated magnetic fields, and orientation relative to gravity. This data is provided by Core Motion’s sensor fusion algorithms.


    Jetzt hab ich final noch Device-motion data getestet.

    iPhone richtig rum gehalten (wie beim Selfie):
    Bildschirmfoto 2022-09-24 um 19.54.10.png
    iPhone auf dem Kopf, aber trotzdem mit Display zu mir:
    Bildschirmfoto 2022-09-24 um 19.54.28.png

    Ich kann keinen signifikanten Unterschied bei den Daten feststellen, oder ich seh es einfach schon nicht mehr.
  • Heruhaundo schrieb:

    ashtari schrieb:

    Du wertest aktuell auch die acceleration aus, also die Beschleunigung des Geräts... Du willst ja aber eigentlich nciht die Beschleunigung, sondern die Rotation haben.

    Da verweise ich gerne auf die CMMotionManager Doku, die sagt..


    Apple schrieb:

    Use a CMMotionManager object to start the services that report movement detected by the device's onboard sensors. Use this object to receive four types of motion data:
    • Accelerometer data, indicating the instantaneous acceleration of the device in three dimensional space.
    • Gyroscope data, indicating the instantaneous rotation around the device's three primary axes.
    • Magnetometer data, indicating the device's orientation relative to Earth's magnetic field.
    • Device-motion data, indicating key motion-related attributes such as the device's user-initiated acceleration, its attitude, rotation rates, orientation relative to calibrated magnetic fields, and orientation relative to gravity. This data is provided by Core Motion’s sensor fusion algorithms.


    Jetzt hab ich final noch Device-motion data getestet.
    iPhone richtig rum gehalten (wie beim Selfie):
    Bildschirmfoto 2022-09-24 um 19.54.10.png
    iPhone auf dem Kopf, aber trotzdem mit Display zu mir:
    Bildschirmfoto 2022-09-24 um 19.54.28.png

    Ich kann keinen signifikanten Unterschied bei den Daten feststellen, oder ich seh es einfach schon nicht mehr.
    Vielleicht bin ich zu doof und verstehe es falsch, aber ich würde die "Gyroscope data" auswerten und nicht die Device-motion data...

    Gyroscopes measure the rotation rate around the x, y, and z axes ==>
    Getting Raw Gyroscope Events

    Accelerometer ==> misst die Geschwindigkeit des Gerätes/Telefons in drei - dimensionaler Achse
    Gyroscop ==> misst die rotation des Gerätes/Telefons in drei-dimensionaler Achse
    Magnetometer ==> misst die gerät-Orientierung anhand des magnetfeldes der Erde
    Device-motion ==> misst ALLES oben genannte + noch mehr

    Ich würde also die Gyroscope Data auswerten, wenn ich dabei keinen signifikanten Unterschied in den Daten während der Drehung feststellen kann, würde ich die Magnetometer Daten auswerten - das Magnetfeld der Erde hast du ja immer (zumindest bis es dann ins Weltraum geht ;-)).

    Und - wie im Link schön dargestellt - interessant an den Gyroscope data ist die Z - Achse des Telefons.

    Lg,
  • Rein prinzipiell:
    Wenn man die Lage bestimmen will, muss man die Beschleunigungswerte verwenden.
    Mann könnte auch die Drehraten nehmen, dann muss aber die Ausgangslage bekannt sein und die Drehraten müssten fortlaufend über die Zeit integriert werden, dann erhält man auch die Lage. Das wird bei drei Achsen recht komplex.
  • Ich habe mein Google-fu bemüht - aus Neugier, weil mir vom reinen Mitlesen nicht klar war, wie man aus einer Beschleunigung - egal ob Bewegung entlang oder Rotation um Achsen - jemals eine Lage ermitteln könnte, ohne über einen definierten Anfangszustand zu verfügen.

    Ohne es geprüft zu haben, liefert das Accelerometer angeblich Beschleunigungskräfte nicht relativ zum Gerät, sondern berücksichtigt auch die Erdanziehungskraft:

    proft.me schrieb:

    The accelerometer can measure acceleration and gravity in three-dimensions. The accelerometer can determine not only how an iOS device is being held, but also whether it’s lying face down or face up on a table. Accelerometers measure g-forces, so a value of 1.0 returned by the accelerometer means that 1g is observed in a particular direction.
    Somit müsste sich also eigentlich die oben genannten Fälle (liegen oder kopfüber hängen) recht leicht identifizieren lassen. Spannend dürfte es werden, wenn das Gerät in Bewegung ist und somit G-Kräfte entsprechender Beschleunigungen eliminiert werden müssten, bevor sich die Lage ermitteln liesse - aber das ist nur theoretische Vermutung.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Hatte ein paar Minuten und habe mir jetzt mal nen Prototypen gebastelt..


    Quellcode

    1. import SwiftUI
    2. import CoreMotion
    3. struct ContentView: View
    4. {
    5. var body: some View {
    6. VStack{
    7. Text("Hello World")
    8. Button("Start test")
    9. {
    10. startGyros()
    11. }
    12. }.padding()
    13. }
    14. func startGyros()
    15. {
    16. let manager = CMMotionManager()
    17. manager.startGyroUpdates()
    18. manager.startAccelerometerUpdates()
    19. Timer.scheduledTimer(withTimeInterval: 4, repeats: true){_ in
    20. print("########")
    21. if let gyroData = manager.gyroData
    22. {
    23. let x = gyroData.rotationRate.x
    24. let y = gyroData.rotationRate.y
    25. let z = gyroData.rotationRate.z
    26. print("x:\(x)\ny:\(y)\nz:\(z)
    27. }
    28. if let data= manager.accelerometerData
    29. {
    30. let x = data.acceleration.x
    31. let y = data.acceleration.y
    32. let z = data.acceleration.z
    33. print("Ax:\(x)\nAy:\(y)\nAz:\(z)
    34. }
    35. }
    36. }
    Alles anzeigen
    Wenn ich mir da jetzt die Prints ausgebe, sind es wie Tolibi sagt und ich falsch vermutet habe, die Accelerationwerte (hier die data.acceleration) die relevant sind..





    Display oben
    Display unten
    x:-0.00047857005847617984
    y:0.00046845004544593394
    z:-0.007959655486047268
    Ax:0.0068206787109375
    Ay:-0.007904052734375
    Az:-0.997039794921875
    x:-0.004143878817558289
    y:0.0011062771081924438
    z:-0.008687231689691544
    Ax:-0.0056304931640625
    Ay:0.0037841796875
    Az:1.0049591064453125
    x:-0.0018836538074538112
    y:0.0034024545457214117
    z:-0.009687514975667
    Ax:0.00640869140625
    Ay:-0.0070953369140625
    Az:-0.997894287109375
    x:-8.602010348113254e-05
    y:0.0007723167072981596
    z:-0.007199323270469904
    Ax:-0.007537841796875
    Ay:0.0032806396484375
    Az:1.0056610107421875
    x:-0.004304467234760523
    y:0.0020519655663520098
    z:-0.008629174903035164
    Ax:0.0088043212890625
    Ay:-0.0074462890625
    Az:-0.998046875
    x:-0.003197923768311739
    y:0.001990712946280837
    z:-0.009067264385521412
    Ax:-0.0045166015625
    Ay:0.0035247802734375
    Az:1.0057220458984375
    x:-0.006515423767268658
    y:0.0022066952660679817
    z:-0.01227211207151413
    Ax:0.0076446533203125
    Ay:-0.00860595703125
    Az:-0.996856689453125
    x:-0.00452737370505929
    y:0.002877012826502323
    z:-0.007417169865220785
    Ax:-0.0054168701171875
    Ay:0.0037994384765625
    Az:1.0044403076171875



    x, y und z spiegeln die gyrodata wieder, die hier kaum Veränderung finden, also erst ein Mal uninteressant sind.

    Der Az wert (Acceleration der z Achse) hingegen zeigt -0.xx Werte, wenn das Handy auf dem Tisch liegt und das Display nach oben schaut und >1.xx Werte, wenn das Display auf dem Tisch liegt.
    Um bei deinem Einsatzcase zu bleiben = liegt der (hier im Beispiel) Az Wert bei > 1.xx, liegt das Handy auf dem Display und dein Content soll nicht angezeigt werden.

    Ich habe mir jetzt nicht die Mühe gemacht die "um den Hals hängen" Werte zu ermitteln, solltest du aber mit obigen Code und nem iPhone schnell selber heraus finden :)

    ps. sollte der Code irgend einen Error schmeißen, ich habe ihn noch einmal handisch hier runter tippen müssen, weil ich an meinem Arbeits-Windoofs-Pc sitze.
  • MyMattes schrieb:

    ...


    Somit müsste sich also eigentlich die oben genannten Fälle (liegen oder kopfüber hängen) recht leicht identifizieren lassen. Spannend dürfte es werden, wenn das Gerät in Bewegung ist und somit G-Kräfte entsprechender Beschleunigungen eliminiert werden müssten, bevor sich die Lage ermitteln liesse - aber das ist nur theoretische Vermutung.
    Genau so ist es! Wobei eine gleichförmige Bewegung mit keiner Beschleunigung verbunden ist. Kleinere Bewegungen könnte man ausfiltern. An die Grenzen gelangt man erst, wenn man z.B. mit dem Auto längere Zeit im Kreis fährt. Dann würde man das Scheinlot bestimmen.