试图找到一种检测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) 在我的根控制器中,我有一个属性 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
我希望在应用程序启动后立即提示用户访问Motion&Fitness数据(CoreMotion)的权限.
现在我正在尝试对数据执行"虚拟"查询以提示对a的权限 application:didFinishLaunchingWithOptions
CMMotionActivityManager *motionActivityManager=[[CMMotionActivityManager alloc]init];
[motionActivityManager startActivityUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMMotionActivity *activity) {
NSLog(@"Dummy query to prompt permission from user");
}];
Run Code Online (Sandbox Code Playgroud)
但是发生的事情是应用程序启动并且它挂在启动画面上 - 如果我按下主页按钮然后应用程序尝试关闭,然后弹出权限提示.
有谁想过如何做到这一点?
我正在开发一个收集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) 我从CMMotionManager获取 CMDeviceMotion对象.CMDeviceMotion的一个属性是时间戳,表示为NSTimeInterval(double).根据文档,这允许"亚毫秒"时间戳精度.
[motionManager startDeviceMotionUpdatesToQueue:motionQueue withHandler:^(CMDeviceMotion *motion, NSError *error) {
NSLog(@"Sample: %d Timestamp: %f ",counter, motion.timestamp);
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,NSTimeInterval是自上次设备启动以来计算的,对以原始形式使用它提出了重大挑战.
有没有人有一个工作代码将此NSTimeInterval转换为类似时间戳(UTC时区)的Unix?
谢谢!
我的申请记录会话.当用户启动记录会话时,我开始从设备的CMMotionManager对象收集数据并将它们存储在CoreData上以便稍后处理和显示.我收集的数据包括gps数据,加速度计数据和陀螺仪数据.数据频率为10Hz.
目前,我正在努力用运动数据计算设备的倾斜角度.可以通过使用重力数据来计算设备的哪一侧着陆,但是我想要计算用户与地面之间的左右角度,而不管行进方向如何.
这个问题需要一些线性代数知识来解决.例如,对于某些点的计算,我必须计算计算平面上的3D线的方程.我正在研究这一天,而且它变得越来越复杂.我根本不擅长数学.一些与该问题相关的数学例子也很受欢迎.
我正在尝试从相机和相关运动数据中捕获帧。对于同步,我使用时间戳。视频和动作被写入文件,然后进行处理。在那个过程中,我可以计算每个视频的运动帧偏移。
结果表明,相同时间戳的运动数据和视频数据相互偏移了不同的时间,从 0.2 秒到 0.3 秒不等。该偏移对于一个视频是恒定的,但因视频而异。如果每次都是相同的偏移量,我就可以减去一些校准值,但事实并非如此。
有没有一种同步时间戳的好方法?也许我没有正确记录它们?有没有更好的方法将它们带到相同的参考系?
CoreMotion 返回相对于系统正常运行时间的时间戳,因此我添加偏移量以获得 unix 时间:
uptimeOffset = [[NSDate date] timeIntervalSince1970] -
[NSProcessInfo processInfo].systemUptime;
CMDeviceMotionHandler blk =
^(CMDeviceMotion * _Nullable motion, NSError * _Nullable error){
if(!error){
motionTimestamp = motion.timestamp + uptimeOffset;
...
}
};
[motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXTrueNorthZVertical
toQueue:[NSOperationQueue currentQueue]
withHandler:blk];
Run Code Online (Sandbox Code Playgroud)
为了获得高精度的帧时间戳,我使用了 AVCaptureVideoDataOutputSampleBufferDelegate。它也偏移到 unix 时间:
-(void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection
{
CMTime frameTime = CMSampleBufferGetOutputPresentationTimeStamp(sampleBuffer);
if(firstFrame)
{
firstFrameTime = CMTimeMake(frameTime.value, frameTime.timescale);
startOfRecording = [[NSDate date] timeIntervalSince1970];
}
CMTime presentationTime = CMTimeSubtract(frameTime, firstFrameTime);
float seconds = CMTimeGetSeconds(presentationTime);
frameTimestamp …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 SWIFTUI 视图中显示加速度计数据。此代码可以打印到控制台,但我不明白如何将其放入视图中,以便我可以在 SWIFTUI 中使用它。
import SwiftUI
import CoreMotion
struct AccelerometerView: View {
let motionManager = CMMotionManager()
let queue = OperationQueue()
var body: some View {
VStack{
Text("accelerate:").onAppear {
print("ON APPEAR")
self.motionManager.startDeviceMotionUpdates(to: self.queue) { (data: CMDeviceMotion?, error: Error?) in
guard let data = data else {
print("Error: \(error!)")
return
}
let attitude: CMAttitude = data.attitude
print("pitch: \(attitude.pitch)")
print("yaw: \(attitude.yaw)")
print("roll: \(attitude.roll)")
}
}//.onappear
//Text("Pitch:\(attitude.pitch)")
}//Vstack
}//view
}//struct
struct AccelerometerView_Previews: PreviewProvider {
static var previews: some View {
AccelerometerView()
}
}
Run Code Online (Sandbox Code Playgroud) core-motion ×10
ios ×9
objective-c ×3
iphone ×2
appdelegate ×1
apple-m7 ×1
avfoundation ×1
math ×1
sdk ×1
swift ×1
swiftui ×1
timestamp ×1
video ×1