有没有人已经编程了iphone罗盘标题倾斜补偿?
我有一些方法,但一些帮助或更好的解决方案将是很酷的!
首先,我定义一个向量Ev,由Gv和Hv的叉积计算得出.Gv是由加速度计值构建的重力矢量,Hv是构建磁力计值的标题矢量.Ev与Gv和Hv垂直,因此它正朝着东方的方向前进.
SECOND我定义了一个向量Rv,由交叉积Bv和Gv计算得出.Bv是我的向量,它被定义为[0,0,-1].Rv垂直于Gv和Bv并始终显示在右侧.
第三,这两个向量Ev和Rv之间的角度应该是我的校正标题.计算角点i构建点积和arcos.
phi = arcos(Ev*Rv/| Ev |*| Rv |)
理论上它应该可以工作,但也许我必须规范化向量?!
有没有人为此得到解决方案?
谢谢,m01d
在我的应用程序中,在主要活动的onCreate()方法中,我正在创建唤醒锁定,以便在手机进入待机/屏幕关闭时CPU将继续运行.
同样在onCreate方法中,我有意创建一个使用加速度计的服务.当应用程序打开并监控加速度计值时,此服务需要持续运行(我知道这对电池不利,但我需要它来做).这是我目前的代码,服务开始很好.
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Howaya");
wl.acquire();
if (appStart == true)
{
Intent AccelService = new Intent(this, Accelerometer.class);
AccelService.putExtra("unreg", false);
startService(AccelService);
}
appStart = false;
}
Run Code Online (Sandbox Code Playgroud)
我的清单中设置了以下权限 -
<uses-permission android:name="android.permission.WAKE_LOCK" />
Run Code Online (Sandbox Code Playgroud)
我尝试过不同的锁 - 昏暗的屏幕和全亮度也无济于事.我在logcat上的输出在这里 -
F/PowerManager(15628): android.util.Log$TerribleFailure: WakeLock finalized while still held: Howaya
F/PowerManager(15628): at android.util.Log.wtf(Log.java:260)
F/PowerManager(15628): at android.util.Log.wtf(Log.java:239)
F/PowerManager(15628): at android.os.PowerManager$WakeLock.finalize(PowerManager.java:329)
F/PowerManager(15628): at dalvik.system.NativeStart.run(Native Method)
Run Code Online (Sandbox Code Playgroud)
我见过有人说部分唤醒锁没有像他们应该做的那样工作,比如这个链接谷歌待机错误页面,但这个是去年发布和关闭所以我不知道是这样的,请问有人可以帮忙吗?关于最后一点我也有HTC Desire,谢谢.
我正在开发一个Windows Phone 7应用程序,我想告诉用户他们的速度有多快.像......一样简单
当前速度:20 km/h最高速度:33 km/h平均速度:25 km/h
我似乎有两个选择:1)使用加速度计2)使用GPS
我想知道人们是否有关于使用哪种方法的建议.
我更喜欢使用GPS(因为它更容易提取),但我知道GPS位置通常由于各种原因而不准确,但速度有多准确?
我必须编写一个iphone应用程序,它可以跟踪iphone本身的运动,考虑到它的初始位置,而不使用GPS.也就是说,我只能使用陀螺仪和加速度计提供的数据.我需要测量的距离相当小,我所寻找的精度最多是40-50厘米(~2英尺).
这可能吗?如果是这样,最好的方法是什么?另外,您是否知道已经实现此功能的任何现有(也可能是开源)项目?
非常感谢!
我想在iPad上找出音高,偏航和滚动1.由于没有deviceMotion功能,我可以从加速度计中获取这些数据吗?我假设我可以使用它返回的向量来比较参考向量,即重力.
iOS是否检测到设备何时静止,然后将其作为重力矢量?或者我必须这样做?谢谢.
我试图从三星Galaxy Tab GT-P1000读取多个传感器,相对于我使用的应用程序,它们似乎相当糟糕地占用了CPU.
作为测试,我创建了一个简短的程序,它实现了Accelerometer传感器的SensorEventListener,但对传感器读数没有任何作用:
public class SensorTestActivity extends Activity implements SensorEventListener {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
SensorManager oSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
oSensorManager.registerListener(this, oSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_GAME);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
}
}
Run Code Online (Sandbox Code Playgroud)
这导致我在调试时(即我的设备已插入我的PC)10%的CPU使用率和5%的使用率而我不是.如果我使用SENSOR_DELAY_FASTEST,那么在我调试时,使用率会持续增长30%,而在我调试时则增长20%.
当我想使用多个传感器时,这会产生一个大问题,因为它们都具有高CPU使用率且没有任何数据处理.我已经使用了Android Market的Compass应用程序,并且他们在给定时间都没有使用超过5%的CPU,所以我觉得我错过了一些明显的东西,但找不到其他人有同样的问题.
我没有为这个应用程序编辑清单文件或布局 - 它是Eclipse制作的默认模板,我添加了传感器.
更新:我读取CPU使用率的方法存在缺陷,因为我正在使用任务管理器来测量它.我的应用程序不是在任务管理器打开时使用onPause停止传感器,而大多数其他应用程序会这样做.
我知道之前有人问过,但我找不到我要找的答案.
我想做的就是把手机放在天空,知道我相对于地平线的角度.所以,如果我把它直接放在我上面(屏幕朝向地面)那么它应该读取90度,如果我把它放在我面前(屏幕面向我),它应该读取0度.
我已经摸索了从加速度计获取数据的一些基础知识,我相信我有X,Y和Y值.我怎样才能拿出这些点并找到我的角度?下面是我收集坐标的OnSensorChanged事件.
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
mGravity = event.values;
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
mGeomagnetic = event.values;
if (mGravity != null && mGeomagnetic != null) {
float R[] = new float[9];
float I[] = new float[9];
boolean success = SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic);
if (success) {
float orientation[] = new float[3];
SensorManager.getOrientation(R, orientation);
playerAngle = (float) Math.toDegrees(Math.atan2(orientation[1], orientation[0]));
}
Run Code Online (Sandbox Code Playgroud) 我想检查Android设备是否有加速度计,以便我可以发出一个祝酒消息,说如果没有加速度计,游戏将无法在当前设备上正常工作.我正在寻找这样的东西:
if(DEVICE_HAS_ACCELEROMETER == false){
Toast.makeText(context,"No Accelerometer Found.",Toast.LENGTH_LONG).show();
}
Run Code Online (Sandbox Code Playgroud)
如果您可以填写DEVICE_HAS_ACCELEROMETER部分,那就可以完成这项工作.
PS:我不参加活动.
我对传感器数据非常着迷.我使用我的iPhone和一个名为SensorLog的应用程序捕获加速度计数据,同时我站立并推动我的双腿跳跃.
我的目标是使用R创建一个模型,该模型可以识别跳跃以及我在空中的时间.我不确定如何进行这样的挑战.我有加速计数据的时间序列.
https://drive.google.com/file/d/0ByWxsCBUWbqRcGlLVTVnTnZIVVk/view?usp=sharing
一些问题:

下面是用于创建上图的R代码,这是我站立并进行简单的跳转.
谢谢!
# Training set
sample <- read.csv("sample-data.csv")
# Sum gravity
sample$total_gravity <- sqrt(sample$accelerometerAccelerationX^2+sample$accelerometerAccelerationY^2+sample$accelerometerAccelerationZ^2)
# Smooth our total gravity to remove noise
f <- rep(1/4,4)
sample$total_gravity_smooth <- filter(sample$total_gravity, f, sides=2)
# Removes rows with NA from smoothing
sample<-sample[!is.na(sample$total_gravity_smooth),]
#sample$test<-rollmaxr(sample$total_gravity_smooth, 10, fill = NA, align = "right")
# Plot gravity
plot(sample$total_gravity, type="l", col=grey(.2), xlab="Series", ylab="Gravity", main="Accelerometer Gravitational Force")
lines(sample$total_gravity_smooth, col="red")
stdevs <- mean(sample$total_gravity_smooth)+c(-2,-1,+1,+2)*sd(sample$total_gravity_smooth)
abline(h=stdevs)
Run Code Online (Sandbox Code Playgroud) 使用内置惯性测量单元(IMU)(也称为行人航位推算(PDR))的用户定位的简单公式如下:
x= x(previous)+step length * sin(heading direction)
y= y(previous)+step length *cos(heading direction )
Run Code Online (Sandbox Code Playgroud)
我们可以使用CMMotionManager类的motionManager属性来访问加速度计,陀螺仪和磁力计的原始值.此外,我们可以获得attitudes滚动,俯仰和偏航等值.步长可以计算为加速度的双平方根.但是,我对标题方向感到困惑.一些已发表的文献使用磁力计和陀螺仪数据的组合来估计航向.我可以看到它CLHeading也提供了标题信息.有一些在线教程,特别是对于像这样的Android平台来估计用户位置.但是,它没有给出任何适当的数学解释.
我跟着像许多在线资源这个,这个,这个和这个做一个PDR应用.我的应用程序可以检测步骤并正确地给出步长,但其输出充满错误.我认为错误是由于缺乏合适的航向.我使用以下关系从磁力计获得前进方向.
magnetometerHeading = atan2(-self.motionManager.magnetometerData.magneticField.y, self.motionManager.magnetometerData.magneticField.x);
Run Code Online (Sandbox Code Playgroud)
同样,来自陀螺仪:
grysocopeHeading +=-self.motionManager.gyroData.rotationRate.z*180/M_PI;
Run Code Online (Sandbox Code Playgroud)
最后,我给前一个标题干涉,gryoscopeheading和磁力计的比例权重如下:
headingDriection = (2*headingDirection/5)+(magnetometerHeading/5)+(2*gryospoceHeading/5);
Run Code Online (Sandbox Code Playgroud)
我从已发表的期刊论文中采用了这种方法.但是,我的工作中出现了很多错误.我的方法有误吗?我究竟应该做些什么才能获得正确的航向,以便定位估算误差最小?
任何帮助,将不胜感激.
谢谢.
编辑
我注意到在使用陀螺仪数据计算航向时,我没有将旋转速率(以弧度/秒为单位)与增量时间相乘.为此,我添加了以下代码:
CMDeviceMotion *motion = self.motionManager.deviceMotion;
[_motionManager startDeviceMotionUpdates];
if(!previousTime)
previousTime = motion.timestamp;
double deltaTime = motion.timestamp - previousTime;
previousTime = motion.timestamp;
然后我更新了陀螺仪标题:
gyroscopeHeading+= -self.motionManager.gryoData.rotationRate.z*deltaTime*180/M_PI;
本地化结果仍然不接近真实位置.我的方法是否正确?
objective-c accelerometer magnetometer gyroscope indoor-positioning-system
accelerometer ×10
android ×4
gps ×2
gyroscope ×2
iphone ×2
cpu-usage ×1
ios ×1
ios4 ×1
iot ×1
ipad ×1
magnetometer ×1
objective-c ×1
r ×1
standby ×1
tilt ×1
time-series ×1
wakelock ×1