我现在没有iPhone 4,我正在尝试找到一个文档,显示偏航,俯仰和滚动的范围以及设备的相应位置.
我知道加速度计从-1到+1不等,但昨天在我的iPhone上进行的测试显示,滚动从-M_PI变化到+ M_PI,但是偏航和俯仰范围是其中的一半.它是否正确?
我在哪里可以找到有关这些范围的文档?我没有在Apple模糊的文档上看到它.
谢谢.
我从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?
谢谢!
我正在研究核心运动类CMAttitude,它可以将设备的方向表示为3x3旋转矩阵.与此同时,我看了一下CATransform3D,其中包含了视图的态度以及缩放.这CATransform3D是一个4x4矩阵.
我已经看到OpenGL旋转矩阵是4x4,只是在第4行和第4列填充了0001.
如果CMAttitude的旋转矩阵与CATransform的矩阵相关,我就会徘徊?
我可以使用通过旋转矩阵获得的空间中的设备旋转来转换UIView CATransform3D吗?我的目的是让用户移动手机并将相同的变换应用到屏幕上的UIView.
额外问题:如果它们相关,我如何将CMAttitude的旋转矩阵转换为CATransform3D?
我的申请记录会话.当用户启动记录会话时,我开始从设备的CMMotionManager对象收集数据并将它们存储在CoreData上以便稍后处理和显示.我收集的数据包括gps数据,加速度计数据和陀螺仪数据.数据频率为10Hz.
目前,我正在努力用运动数据计算设备的倾斜角度.可以通过使用重力数据来计算设备的哪一侧着陆,但是我想要计算用户与地面之间的左右角度,而不管行进方向如何.
这个问题需要一些线性代数知识来解决.例如,对于某些点的计算,我必须计算计算平面上的3D线的方程.我正在研究这一天,而且它变得越来越复杂.我根本不擅长数学.一些与该问题相关的数学例子也很受欢迎.
我是一名coremotion初学者.
我需要检测平板表面上的iPhone移动 - 到目前为止,我通过访问陀螺仪的偏航来检测其侧向移动,但我想不出一种检测上/下变化的方法.我尝试使用加速度计,但它检测到更多的设备倾斜而不是移动.此外,当运动停止时会有反作用力.
您是否有任何想法,以便能够以相当精确的方式获得运动数据?我需要它来做空气曲棍球比赛.
我试图检测用户何时将iPhone撞到另一个物体而不是他们只是摇动手机.我似乎无法让它完全按照我想要的方式工作,因为它要么记录太多的颠簸,没有碰撞,要么认为震动是一个颠簸.
有人可以查看下面的代码并提供建议吗?我需要确定一个或另一个发生.
// SHAKING
- (void) motionEnded: (UIEventSubtype) motion withEvent:(UIEvent *)event
{
if (motion == UIEventSubtypeMotionShake)
{
[self setNumberOfShakes: [self numberOfShakes] + 1];
[self reloadAllTapShakeData];
}
}
// TAPPING & BUMPING
- (void) setupAccelerometerMonitoring
{
[self setManager: [[CMMotionManager alloc] init]];
if ([[self manager] isDeviceMotionAvailable])
{
[[self manager] setDeviceMotionUpdateInterval: 0.02];
[[self manager] startDeviceMotionUpdatesToQueue: [NSOperationQueue mainQueue] withHandler: ^(CMDeviceMotion * _Nullable motion, NSError * _Nullable error)
{
//NSLog(@"x = %f | y = %f | z = %f", [motion userAcceleration].x, [motion userAcceleration].y, [motion …Run Code Online (Sandbox Code Playgroud) 我正在CMDeviceMotion使用本答案中描述的CMDeviceMotion扩展将SceneKit相机设置为当前姿态:
func deviceDidMove(motion: CMDeviceMotion?, error: NSError?) {
if let motion = motion {
let orientation = motion.gaze(atOrientation: UIApplication.sharedApplication().statusBarOrientation)
cameraNode.orientation = orientation
}
}
Run Code Online (Sandbox Code Playgroud)
这很漂亮,但是,我想阻止旋转(滚动)并且只允许相机转动(偏转)和俯仰.
我试图将四元数转换回欧拉角,并将roll保持为0:
cameraNode.eulerAngles = SCNVector3(
x: orientation.pitch(),
y: orientation.yaw(),
z: 0)
Run Code Online (Sandbox Code Playgroud)
然而,这仅适用于偏航运动的一半.另一半,相机倒置.我怀疑这是涉及欧拉角的万向节锁定问题.
四元数对我来说有点像黑魔法,但是有没有办法直接在四元数上去除滚动分量,这样我就可以避免欧拉角?
我正在尝试从相机和相关运动数据中捕获帧。对于同步,我使用时间戳。视频和动作被写入文件,然后进行处理。在那个过程中,我可以计算每个视频的运动帧偏移。
结果表明,相同时间戳的运动数据和视频数据相互偏移了不同的时间,从 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) Skype 在iPhone的视频会议应用程序中添加了防抖功能.怎么办?
core-motion ×10
ios ×8
iphone ×5
algorithm ×1
avfoundation ×1
camera ×1
cocoa-touch ×1
gyroscope ×1
math ×1
matrix ×1
quaternions ×1
scenekit ×1
swiftui ×1
timestamp ×1
video ×1