我有一个CMRotationMatrix*rot,我想得到矩阵中的俯仰,偏航,滚动.任何想法我怎么能这样做?
谢谢
嗯......我落后于时代并尝试将一些旧代码移植到新应用程序并且不推荐使用加速器委派.必须有一个替代品.请指出我的文档并让我开始.
我可以检查用户是否授权的健身数据使用-[CMMotionActivityManager queryActivityStartingFromDate:toDate:toQueue:withHandler:],并检查错误(CMErrorNotAuthorized或CMErrorMotionActivityNotAuthorized在处理程序).
如果用户进入隐私设置并拒绝我的应用程序,该应用程序将被终止,当我重新启动它时,一切正常.
如果用户转到隐私设置并全局拒绝健身数据,则应用程序不会被杀死,使用上述方法检查不会报告任何错误!
我必须针对iOS 8,所以我无法使用+[CMSensorRecorder isAuthorizedForRecording].
你有解决这个问题的可靠方法吗?拥有一个很好的位置授权API 非常烦人,但不适合这个!
试图找到一种检测M7存在的方法.
如果M7不存在,查询CMStepCounter或CMMotionActivity类是否毫无意义?我的猜测是,在拥有iOS 7.0的非M7型号上,这些类可以获得数据,但效率并不高,而且使用的电池更多.
粗暴的方式是:
struct utsname systemInfo;
uname(&systemInfo);
model = [[NSString alloc] initWithCString:systemInfo.machine
encoding:NSUTF8StringEncoding];
version = [[NSString alloc] initWithString:[[UIDevice currentDevice] systemVersion]];
if ([model compare:@"iPhone6,1"]) {
}
Run Code Online (Sandbox Code Playgroud) 请忍受我的长期问题,我想尽可能清楚.
我想要做的是,当使用相机拍摄照片时获得姿态(滚动倾斜和偏航),然后将姿态值保存到nsuserdefaults.保存后,方向会改变,然后通过不断比较姿态值(保存和当前)来尝试使手机处于相同的姿势.
出于界面的目的,用户界面在屏幕上具有3个点(每个姿态参数一个),其指导拍摄照片的正确方向.达到正确的态度后,屏幕上会显示匹配标志.
我一直在寻找滚动,俯仰和偏航值:
CMQuaternion quat = self.motionManager.deviceMotion.attitude.quaternion;
myRoll = radiansToDegrees(atan2(2*(quat.y*quat.w - quat.x*quat.z), 1 - 2*quat.y*quat.y - 2*quat.z*quat.z)) ;
myPitch = radiansToDegrees(atan2(2*(quat.x*quat.w + quat.y*quat.z), 1 - 2*quat.x*quat.x - 2*quat.z*quat.z));
myYaw = radiansToDegrees(2*(quat.x*quat.y + quat.w*quat.z));
Run Code Online (Sandbox Code Playgroud)
当我注意到偏航值存在一些差异时,我搜索并可以从这里找到:链接,那个
来自四元数的偏航,俯仰和滚动,你将遇到同样的问题,就好像你只使用偏航,俯仰和滚转一样.你必须使用四元无处不在你的代码,而忘记了偏航,俯仰和滚转
所以现在我想我必须再次对所有内容进行编码...请你能够如此友好地指出我为此目的使用Quaternion的示例代码吗?
这是我正在处理的代码:
在ViewController.m中,在图像中:didFinishSavingWithError:
[self.motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMDeviceMotion *motion, NSError *error) {
CMQuaternion quat = self.motionManager.deviceMotion.attitude.quaternion;
double tempYaw = radiansToDegrees(asin(2*(quat.x*quat.y + quat.w*quat.z)));
double tempRoll = radiansToDegrees(atan2(2*(quat.y*quat.w - quat.x*quat.z), 1 - 2*quat.y*quat.y - 2*quat.z*quat.z)) ;
double tempPitch = radiansToDegrees(atan2(2*(quat.x*quat.w + …Run Code Online (Sandbox Code Playgroud) 在我的根控制器中,我有一个属性 CMMotionManager
@property (strong, nonatomic) CMMotionManager *MManager;
Run Code Online (Sandbox Code Playgroud)
在它的吸气器中我做懒惰的实例化.当控制器的视图加载时,我调用此方法
- (void)reloadAccelerometer {
NSLog(@"Away we go");
self.MManager.deviceMotionUpdateInterval = 10.0/60.0;
[self.MManager startDeviceMotionUpdatesToQueue:self.queue withHandler:^(CMDeviceMotion *motion, NSError *error) {
NSLog(@"Y values is: %f", motion.userAcceleration.y);
}];
}
Run Code Online (Sandbox Code Playgroud)
我看到"离开我们去" NSLog然后立即应用程序崩溃,我得到这个线程日志
libsystem_platform.dylib`spin_lock$VARIANT$mp:
0x39a87814: movs r1, #1
libsystem_platform.dylib`OSSpinLockLock$VARIANT$mp + 2:
0x39a87816: ldrex r2, [r0]
0x39a8781a: cmp r2, #0
0x39a8781c: it ne
0x39a8781e: bne.w 0x39a893ec ; _OSSpinLockLockSlow$shim
0x39a87822: strex r2, r1, [r0]
0x39a87826: cmp r2, #0
0x39a87828: bne 0x39a87816 ; OSSpinLockLock$VARIANT$mp + 2
0x39a8782a: dmb ish
0x39a8782e: bx lr …Run Code Online (Sandbox Code Playgroud) 我遇到的问题是,当用户使用我们的应用程序拍照时AVCaptureSession,我无法确定他们是以纵向还是横向模式拍摄照片.我们的应用程序仅支持Portrait,我在使用手机时保持方向锁定,因此我正在尝试构建一个解决方案,假设其他人也可以这样做.
我查看了使用[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]但是当Orientation Lock打开时,没有收到任何通知.我知道此功能是可行的,因为当我的手机启用了方向锁定时,基本相机应用和Google环聊应用中的相机可以检测到旋转(取消和Flash按钮上的动画很明显).
我最好使用加速度计并检测手机旋转的角度?一个老的答案,检测iPhone的屏幕方向,很明显检测到这种方式的角度很容易做到(显然适应使用Core Motion而不是UIAccelerometer的答案),但我很好奇是否有另一种方法可以做它.
objective-c accelerometer ios core-motion uideviceorientation
我正在开发一个收集CoreMotion数据的应用程序,我正在使用现有的应用程序商店应用程序作为参考,以确保我正确地收集数据.
在大多数情况下,一切都是等价的,但我在某些测试中看到了一些奇怪的数据.问题出现在滚动,俯仰和偏航值上,然而,来自加速度计,陀螺仪和磁力计的原始数据是等效的...
下面的图表绘制了从100Hz的装备上的5个设备收集的数据:
首先,从SensorLog收集的数据:
其次,从我的应用收集的数据:
第三,从我的应用程序收集的数据,但这次@ 10Hz:

观察:
放大图块:
并在上图中覆盖手动拉伸的滚动数据:
码:
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() { …Run Code Online (Sandbox Code Playgroud) 我正在制作一个能够在风景中制作全景视频的应用程序.在横向上,它支持两个方向:从左到右,从下到上.
因此,当用户从左向右移动手机或向右旋转时,我想从左向右移动箭头.当垂直向上移动设备时,也希望将箭头从底部移到顶部.在具有全景选项的原生iPhone相机应用程序中,我们可以看到正确的模拟,
我的问题是1)我怎么知道用户正在从左到右或从右到左移动手机.因为像iPhone全景,我想在用户搬回时停止录制.
另外2)我怎么知道用户正在垂直向上移动手机
补充:2017年11月10日:我确实在AppStore中看到了一个名为Spincle的应用程序.从左向右旋转设备时,它会移动箭头以拍摄360度图像.我只是设法使用俯仰和滚动来实现这一点(参见下面的代码).但是,如果我们将设备放在地板或屋顶上,这将无法工作.
import UIKit
import CoreMotion
class ViewController: UIViewController {
private let motionManager = CMMotionManager()
let arrowView = UIView()
func startMotion() {
var initialAttitude: CMAttitude?
motionManager.deviceMotionUpdateInterval = 1
let queue = OperationQueue.current!
let statusBarOrientation = UIApplication.shared.statusBarOrientation
motionManager.startDeviceMotionUpdates(using: CMAttitudeReferenceFrame.xArbitraryZVertical, to: queue) { (motiondata, err) in
guard let data = motiondata else { return }
if initialAttitude == nil {
initialAttitude = data.attitude
} else {
let attitude = data.attitude
// translate the attitude
attitude.multiply(byInverseOf: initialAttitude!)
// calculate pitch …Run Code Online (Sandbox Code Playgroud) core-motion ×10
ios ×9
objective-c ×3
iphone ×2
swift ×2
apple-m7 ×1
deprecated ×1
ios5 ×1
opengl-es ×1
quaternions ×1
sdk ×1