将 iPhone 加速度计设置为 ±8g 模式

Posted

技术标签:

【中文标题】将 iPhone 加速度计设置为 ±8g 模式【英文标题】:Set iPhone accelerometer to ±8g mode 【发布时间】:2012-06-03 02:09:44 【问题描述】:

是否可以将 iPhone 加速度计设置为接收 ±8g 范围内的数据? (据我所知ST LIS331DLH安装在iPhone上的加速度计支持这种模式)

我们不仅在研究标准 API,还在研究

未记录的函数 可能的 ios 黑客攻击 硬件修补

无论如何将加速度计范围扩展到标准±2g之外

【问题讨论】:

欲了解更多信息:iphonedevsdk.com/forum/iphone-sdk-development/…。 You cannot change the mode with any published feature of the APIs. 我猜你需要一个越狱设备和一种在调用 SDK 函数之前更改加速度计模式的方法。 你不知道Apple Watch上使用的是什么运动传感器吗?正如我所见,他们有限制 +-16g 【参考方案1】:

我的“答案”包含对 Evgeny 问题的直接回答。但是,我发现了一堆可能会有所帮助的未记录功能。

我在 iOS SDK 中搜索了与加速度计相关的功能。似乎一切都归结为两个框架之一(其他框架依赖于其中之一):SpringBoardServices(私有)和CoreMotion。

SpingBoardServices API 比较简单: 另见:SBSAccelerometer description

objective-C API:

@interface SBSAccelerometer : XXUnknownSuperclass 
    id<SBSAccelerometerDelegate> _delegate;
    CFRunLoopSourceRef _accelerometerEventsSource;
    CFRunLoopRef _accelerometerEventsRunLoop;
    double _interval;
    NSLock* _lock;
    BOOL _orientationEventsEnabled;
    int _orientationEventsToken;
    NSThread* _orientationEventsThread;
    float _xThreshold;
    float _yThreshold;
    float _zThreshold;

@property(assign, nonatomic) id<SBSAccelerometerDelegate> delegate;
@property(assign, nonatomic) BOOL orientationEventsEnabled;
@property(assign, nonatomic) float zThreshold;
@property(assign, nonatomic) float yThreshold;
@property(assign, nonatomic) float xThreshold;
@property(assign, nonatomic) double updateInterval;
@property(assign, nonatomic) BOOL accelerometerEventsEnabled;
-(id)init;
-(void)dealloc;
-(void)_checkIn;
-(void)_checkOut;
-(void)_serverWasRestarted;
-(int)currentDeviceOrientation;
-(id)_orientationEventsThread;
-(void)_orientationDidChange;
@end 

C-API(方法签名未知):

int SBAccelerometer_server(struct unknown *in, struct unknown *out); //returns 1 on success, 0 otherwise
int SBAccelerometer_server_routine(struct unknown *in); // retuns 0 on error;
(?) SBSetAccelerometerClientEventsEnabled(...);
(?) SBSetAccelerometerDeviceOrientationChangedEventsEnabled(...);
(?) SBSetAccelerometerRawEventsInterval(...);
(?) SBXXDeliverAccelerometerEvent(...);
(NSString* or char*) _SBXXSBAccelerometer_subsystem;

CoreMotion 框架底层 API 是 C++ API。我不会发布所有 API(它比 SpingBoardServices 大得多),但有最有希望的部分:

CLSensorFusionAccelerometerOnly::reset(float)
CLSensorNetworkProtocol::isAccelerometerPacket(__CFData const*)
CLSensorNetworkProtocol::serializeAccelerometerPacket(CLAccelerometer::Sample const&)
CLSensorNetworkProtocol::deserializeAccelerometerPacket(__CFData const*)
CLSensorInterface::setAccelerometerCallbackAndInfo(void (*)(void*, CLMotionTypeVector3 const&, double const&), void*)

【讨论】:

【参考方案2】:

不幸的是,没有本地方法可以做到这一点。另一方面,如果你愿意越狱,你可以得到一个 Cydia 调整(我不记得名字),它会降低加速度计的灵敏度。如果你把它的灵敏度设为25%,它应该能感应到±8g。仅供参考,如果您正在从应用程序读取输出,它的范围仍为 ±2g,但通过调整,您必须记住读数将按比例缩小 1/4。 (意味着应用中的 2g = 实际空间中的 8g)。

【讨论】:

我对越狱和调整设备没问题。这个调整的名称是什么?我可以在哪里了解更多信息? @EvgenyVinnik 对不起,我不记得了。我把它放在我的 iPhone 上,因为方向太容易改变了。现在,如果这是您自己的应用程序,您还可以在自己的代码中缩放加速度计输出。即 accelOutput.x * 4 = X g 力从 -8 到 +8。对不起,我不能帮你更多。

以上是关于将 iPhone 加速度计设置为 ±8g 模式的主要内容,如果未能解决你的问题,请参考以下文章

iPhone的加速器刷新率

iPhone - 使用陀螺仪/加速度计检测运动

加速度计在 iphone4 上不起作用

加速度计到相对位置

使用ramdisk内存分区给常用软件加速

iPhone13加大电池但价格下跌,旧款iPhone将被迫加速跌价