我想以45度的增量检测iPhone的方向.理想情况下,我希望能够沿任何轴获得方向角.
我需要做的检测类似于当T方向改变时,iPhone的Trism如何向屏幕的当前底部位置闪烁箭头.
我有一些编码,但实际上不明白加速度计读数如何工作,可以使用正确方向的微调.我当前的代码记录了当前的角度,但即使手机是平的,我的读数每秒也会变化很多.
- (void) checkOrientation:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration
{
int accelerationX = acceleration.x * kfilteringFactor + accelerationX * (1.0 - kfilteringFactor);
int accelerationY = acceleration.y * kfilteringFactor + accelerationY * (1.0 - kfilteringFactor);
float currentRawReading = (atan2(accelerationY, accelerationX)) * 180/M_PI;
NSLog(@"Angle: %f",currentRawReading);
}
Run Code Online (Sandbox Code Playgroud)
手机平放时来自日志的样本:
2009-06-16 17:29:07.987 [373:207] Angle: 0.162292
2009-06-16 17:29:07.994 [373:207] Angle: 179.838547
2009-06-16 17:29:08.014 [373:207] Angle: 179.836182
2009-06-16 17:29:08.032 [373:207] Angle: -90.000000
2009-06-16 17:29:08.046 [373:207] Angle: 179.890900
2009-06-16 17:29:08.059 [373:207] Angle: -90.000000
2009-06-16 17:29:08.074 [373:207] Angle: 179.917908
2009-06-16 17:29:08.088 …Run Code Online (Sandbox Code Playgroud) 我已经在网上发布的教程的帮助下开发了一个示例应用程序.我的目标是访问加速度计并根据手机方向移动球.我成功地证明了这一点.但我有两个问题
这是我的代码.是否有任何改变我需要做的是让我们在很多比赛中看到球的平稳和精确的运动.
public class Accelerometer extends Activity implements SensorEventListener{
/** Called when the activity is first created. */
CustomDrawableView mCustomDrawableView = null;
ShapeDrawable mDrawable = new ShapeDrawable();
public static int x;
public static int y;
private Bitmap mBitmap;
private Bitmap mWood;
private SensorManager sensorManager = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// Get a reference to a SensorManager
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
mCustomDrawableView = new CustomDrawableView(this);
setContentView(mCustomDrawableView); …Run Code Online (Sandbox Code Playgroud) 我需要一些帮助确认一些基本的DSP步骤.我正在实施一些智能手机加速计传感器信号处理软件,但我之前没有使用过DSP.
我的程序以32 Hz的频率实时采集加速度计数据.输出应该是信号的主要频率.
我的具体问题是:
从实时流中,我正在收集一个具有50%重叠的256个样本窗口,正如我在文献中所读到的那样.也就是说,我一次添加128个样本以填充256个样本窗口.这是正确的方法吗?
下面的第一个图显示了一个这样的256个样本窗口.第二个图显示了应用Hann/Hamming 窗口函数后的示例窗口.我已经读过应用窗口函数是一种典型的方法,所以我继续前进并做到了.我应该这样做吗?
第三个窗口显示FFT库输出的功率谱(?).我真的在拼凑我读过的点点滴滴.我是否正确理解频谱上升到采样率的1/2(在这种情况下为16 Hz,因为我的采样率为32 Hz),每个频谱点的值是频谱[i] = sqrt(real [我] ^ 2 +想象[i] ^ 2)?这是正确的吗?
假设我在问题3中所做的是正确的,我的理解是正确的,第三个数字显示大约3.25赫兹和8.25赫兹的主要频率?我知道从收集大约3赫兹运行的数据时,3.25赫兹的峰值似乎是正确的.因此必须有一些噪声,其他因素导致(错误的)峰值在8.25 Hz.是否有任何过滤器或其他方法可以用来平滑这个和其他尖峰?如果没有,有没有办法从错误的尖峰中确定"真正的"尖峰?

我正在研究一个Android项目,我正在使用FFT处理加速度计数据,我在理解这些东西是如何工作方面遇到了问题.我正在使用Piotr Wendykier的jTransform库,方法如下:
int length = vectors.length;
float[] input = new float[length*2];
for(int i=0;i<length;i++){
input[i]=vectors[i];
}
FloatFFT_1D fftlib = new FloatFFT_1D(length);
fftlib.complexForward(input);
float outputData[] = new float[(input.length+1)/2];
if(input.length%2==0){
for(int i = 0; i < length/2; i++){
outputData[i]= (float) Math.sqrt((Math.pow(input[2*i],2))+(Math.pow(input[2*(i)+1], 2)));
}
}else{
for(int i = 0; i < length/2+1; i++){
outputData[i]= (float) Math.sqrt((Math.pow(input[2*i],2))+(Math.pow(input[2*i+1], 2)));
}
}
List<Float> output = new ArrayList<Float>();
for (float f : outputData) {
output.add(f);
}
Run Code Online (Sandbox Code Playgroud)
结果是一个包含以下数据的数组
.
我有解释输出数据的问题.数据来自10秒长的间隔,采样频率是50Hz ..虽然我手里拿着手机每隔3/4秒上下移动手机,所以可能关于x值16的极值可能是信号中最强分量的周期?我需要获得信号中最强组件的频率.
我正在android中创建一个应用程序,我需要检测这个人是否摔倒了.我知道这个问题已经被问及在其他论坛中使用矢量数学但是我没有得到准确的结果.
以下是我检测跌倒的代码:
@Override
public void onSensorChanged(SensorEvent arg0) {
// TODO Auto-generated method stub
if (arg0.sensor.getType()==Sensor.TYPE_ACCELEROMETER) {
double gvt=SensorManager.STANDARD_GRAVITY;
float vals[] = arg0.values;
//int sensor=arg0.sensor.getType();
double xx=arg0.values[0];
double yy=arg0.values[1];
double zz=arg0.values[2];
double aaa=Math.round(Math.sqrt(Math.pow(xx, 2)
+Math.pow(yy, 2)
+Math.pow(zz, 2)));
if (aaa<=6.0) {
min=true;
//mintime=System.currentTimeMillis();
}
if (min==true) {
i++;
if(aaa>=13.5) {
max=true;
}
}
if (min==true && max==true) {
Toast.makeText(FallDetectionActivity.this,"FALL DETECTED!!!!!" ,Toast.LENGTH_LONG).show();
i=0;
min=false;
max=false;
}
if (i>4) {
i=0;
min=false;
max=false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
为了解释上面的代码,我使用了矢量和并检查该值是否已达到低于或等于6(同时下降)并突然大于13.5(着陆时)以确认下降.
现在我在论坛上被告知如果设备仍然是矢量和将返回值9.8.虽然下降它应该接近0并且在着陆时应该到20左右.在我的情况下似乎没有发生这种情况.如果我在任何地方出错,请有人建议吗?
假设iPhone放在一张平台上.我想确定桌面的角度,其中0的角度意味着桌子与重力矢量完全垂直.我使用以下公式:
radians = atanf (z / sqrt (x^2 + y^2)
Run Code Online (Sandbox Code Playgroud)
在.h
double accelerationXAverage;
double accelerationYAverage;
double accelerationZAverage;
double accelerationXSum;
double accelerationYSum;
double accelerationZSum;
int readingsCount;
Run Code Online (Sandbox Code Playgroud)
在他们中
#define kThresholdMovementHigh 0.05
- (void)accelerometer:(UIAccelerometer *)accelerometer
didAccelerate:(UIAcceleration *)acceleration
{
// did device move a lot? if so, reset sums
if (fabsf(acceleration.x - accelerationXAverage) > kThresholdMovementHigh ||
fabsf(acceleration.y - accelerationYAverage) > kThresholdMovementHigh ||
fabsf(acceleration.z - accelerationZAverage) > kThresholdMovementHigh )
{
NSLog(@"deviceDidMove a lot");
accelerationXSum = acceleration.x;
accelerationYSum = acceleration.y;
accelerationZSum = acceleration.z;
readingsCount = 1; …Run Code Online (Sandbox Code Playgroud) 我需要计算用户移动的速度.因此,我们需要两两件事来计算速度,这是GPS和Accelerometer.
但两者都有其局限性.
1)GPS一直无法使用.虽然我得到了用户的当前位置,但我始终Network provider只是来自而不是来自GPS.
2)Accelerometer不准确.
那我应该采用哪种方法?
我发现了一种从加速度计读数中消除重力的美丽快速方法。但是,我有一个6dof IMU(XYZ陀螺仪,XYZ加速度计,无磁力计),所以我不确定是否可以使用此代码(我尝试过并且无法正常工作)。
有人将如何去除重力分量?这是一个很大的障碍,因为我无法继续进行我的项目。
编辑:
是)我有的:
我想要的是:
基本上,无论飞机如何定向,我都想阅读对地球的加速度!但是第一步,我想是要消除重力。
当应用程序在后台运行/设备处于睡眠模式时,我需要加速器更新.一些应用程序这样做,我无法使其工作.为此,我在appdelegate和我调用的applicationDidEnterBackground中有一个CoreMotion属性
-(void) startAccelerationUpdates
{
self.motionManager.deviceMotionUpdateInterval = 0.01;
[self.motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue]
withHandler:^(CMDeviceMotion *motion, NSError *error){
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"acceleration x %f", motion.userAcceleration.x);
NSLog(@"acceleration y %f", motion.userAcceleration.y);
NSLog(@"acceleration z %f", motion.userAcceleration.z);
}
);
}
];
}
Run Code Online (Sandbox Code Playgroud)
在app plist中,我将所需的后台模式放到App寄存器中以进行位置更新.当我将设备置于睡眠模式或后台时,日志中不会显示任何更新.当应用程序处于活动状态时,coremotion会启动loggin.有人给我一个暗示吗?谢谢.
我正在尝试在Unity for Android中实现加速度计/陀螺仪控制的游戏.
用户将持有标题为45度的手机景观.根据他的倾斜度,它将控制相机的音高.根据他的滚动,它将控制相机的偏航.
我一直在阅读加速度计和陀螺仪,但似乎无法理解如何应用它来满足我的需要.
accelerometer ×10
android ×5
fft ×2
ios ×2
java ×2
audio ×1
core-motion ×1
embedded ×1
gps ×1
gravity ×1
gyroscope ×1
iphone ×1
objective-c ×1
orientation ×1
sensor ×1