【问题标题】:How can I find the initial CMAttitude to normalize subsequent queued device motion attitude pulls?如何找到初始 CMAttitude 以规范后续排队的设备运动姿态拉动?
【发布时间】:2020-06-16 17:10:31
【问题描述】:

我有一个简单的 Swift 运动跟踪应用程序,它可以拉动手机的三轴旋转速度和姿态。我正在尝试使用以初始态度作为参考的 multiply(byInverseOf: ) 来标准化态度。目前 initialAttitude 正在返回 0,0,0。在我的 viewController 类中,我有以下内容:

var results : [(rotationRateX: Double, rotationRateY: Double, rotationRateZ: Double, pitch: Double, roll: Double, yaw:Double)] = []
var motionManager = CMMotionManager()
var attitudes : [(CMAttitude)] = []

func startCollectingData()
{

    motionManager.deviceMotionUpdateInterval = 1.0 / 100
    motionManager.startDeviceMotionUpdates(using: CMAttitudeReferenceFrame.xArbitraryZVertical, to: OperationQueue.current!) { (data, error) in

        if let myData = data
        {

            let rotationRateX = (myData.rotationRate.x)
            let rotationRateY = (myData.rotationRate.y)
            let rotationRateZ = (myData.rotationRate.z)

            let attitude = (myData.attitude)
            self.attitudes += [(attitude)]

            let initialAttitude = self.attitudes.first
            attitude.multiply(byInverseOf: initialAttitude!)

            let pitch = attitude.pitch
            let roll = attitude.roll
            let yaw = attitude.yaw

            self.results += [(rotationRateX:rotationRateX, rotationRateY:rotationRateY, rotationRateZ:rotationRateZ, pitch:pitch, roll:roll, yaw:yaw)]

            }
        }
}

当我尝试首先拉出 initialAttitude 时,在 deviceMotionUpdates(如下所示)之前它是 nil。

var results : [(rotationRateX: Double, rotationRateY: Double, rotationRateZ: Double, pitch: Double, roll: Double, yaw:Double)] = []
var motionManager = CMMotionManager()


func startCollectingData()
{
    let initialAttitude = motionManager.deviceMotion!.attitude
    motionManager.deviceMotionUpdateInterval = 1.0 / 100
    motionManager.startDeviceMotionUpdates(using: CMAttitudeReferenceFrame.xArbitraryZVertical, to: OperationQueue.current!) { (data, error) in

        if let myData = data
        {

            let rotationRateX = (myData.rotationRate.x)
            let rotationRateY = (myData.rotationRate.y)
            let rotationRateZ = (myData.rotationRate.z)

            attitude.multiply(byInverseOf: initialAttitude!)

            let pitch = attitude.pitch
            let roll = attitude.roll
            let yaw = attitude.yaw

            self.results += [(rotationRateX:rotationRateX, rotationRateY:rotationRateY, rotationRateZ:rotationRateZ, pitch:pitch, roll:roll, yaw:yaw)]

            }
        }
}

【问题讨论】:

    标签: swift core-motion cmattitude


    【解决方案1】:

    当我尝试首先拉出 initialAttitude 时,在 deviceMotionUpdates(如下所示)之前它是 nil。

    是的,所以你一直扔掉那些结果,直到你第一次得到一个不是nil的结果。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 2022-10-06
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多