Swift UI中风向仪与指南针角度跳转异常问题求助
SwiftUI风向仪/指南针角度跳转异常问题排查
我正在开发一款包含风向仪和指南针的SwiftUI应用,两者都遇到了相同的问题:以风向仪为例,通过风速传感器每秒获取风向与风速数据,数据本身正常,但当角度从1°跳转到359°(或反向跳转)时,风向仪的旋转不符合自然运行逻辑,出现异常。
已尝试的无效解决方案
- 方案1:仅能适配0°附近的角度过渡,在180°阈值时仍会出现相同异常;
- 方案2:将两个角度值存入数组,计算角度间最短路径并应用差值来实现正确旋转方向,同样无效。
异常表现参考动图:风向仪出现无规律的疯狂旋转
数值问题参考截图:传感器返回的角度数值(红圈标注处显示路径计算的符号错误)
相关代码
计算逻辑位于MQTT管理器中,计算完成后将windAngle值传递至视图,代码如下:
func mqtt(_ mqtt: CocoaMQTT, didReceiveMessage message: CocoaMQTTMessage, id: UInt16) { if let str = message.string { print(str) let strSplit = str.split(separator: ",") windAngle = Double(strSplit[1])! // MARK: Solution 1 // if windAngle <= 180 { // windAngle = windAngle // print(windAngle) // } else { // windAngle = -(360 - windAngle) // print(windAngle) // } // MARK: - Solution 2 // windArray.append(windAngle) // print(windArray.count) // // kind of calibration // if windArray.count > 2 { // let diff1 = windArray[2] - windArray[1] // let diff2 = -(360 - windArray[2] - windArray[1]) // print(windArray[1]) // print(windArray[2]) // print(diff1) // print(diff2) // if (diff1.magnitude <= diff2.magnitude) { // windAngle = windArray[1] + diff1 // } else { // windAngle = windArray[1] + diff2 // } // windArray[1] = windArray[2] // windArray.removeLast() // } windSpeed = Double(strSplit[3])! } }
编辑1:修正后仍存在问题
我修正了代码中两个模差值之和不等于360的错误,但结果仍不理想:
let diff1 = windArray[2] - windArray[1] let diff2 = -(windArray[2] - windArray[1] + 360) // <-- correction here print("first wind angle: \(windArray[1])") print("next wind angle: \(windArray[2])") print("first path difference: \(diff1)") print("second path diference: \(diff2)")
从数值截图的红圈标注可以看出,算法虽能选择正确长度的路径,但符号错误,导致角度变化方向异常。确定路径计算存在问题,但未能发现具体原因,恳请协助排查并提供有效解决方案。
内容的提问来源于stack exchange,提问作者bacata.borisov
相关产品推荐
相关产品推荐

