我有一个加速度计和磁力计,每个都产生原始的X,Y和Z读数.由此我需要确定物体的磁航向.
我在触发器上的表现并不是很好,但是我已经把一个对设备的旋转做出很好反应的公式放在一起,但也响应了人们认为不相关的运动,例如将设备倾斜到这样的状态.这种方式对指向的方向没有影响.如平放和"滚动"设备.
我认为我用于计算磁航向的公式很好,但我认为我输入的俯仰和滚动弧度是错误的.
所以我想我的问题的核心(除非有人实际上有一个公式就是这样做),你是如何用弧度计算角度的,使用加速度计进行俯仰和滚动.
其次,标题公式本身的任何信息都会很棒.
这可能很难解释几何,所以我会小心拼写它.这在标准compas应用程序和CLLocationManager中的数据中可见.
1)当纵向握住手机时,请考虑俯仰角为0°
2)当将摄像机指向天空(例如拍摄云层照片)时,俯仰角度从0° - > 90°,其中90度是直线向上.
3)当手机向上倾斜(> 0度并在"X"磁力计轴上旋转)时,当手机处于大约(但不完全)45度时,指南针前进180度旋转.因此,当相机仍为"N"点时,指南针将报告"S".
4)对于下一个(大致)90度,罗盘航向旋转180度.
标题的这种旋转对我来说是破坏性的,并且它与加速度计不完全对齐.使用CLHeading数据中的RAW数据(X,Y,Z)来计算航向数据是否有一个很好的教程(我没有找到一个)?
最终的结果是我希望指南针的标题始终与相机的标题相匹配.
我想让设备偏离磁北角度,并在我写的一些代码中使用该值.
我不想使用该设备的位置服务,因此我对获得True North而不是Magnetic North(仅使用设备的磁力计)感兴趣.
哪个类(或编码过程......)可以为我提供该值(仅依靠磁力计)?
CLLocationManager类及其属性依赖于启用/可用的位置服务
Core Motion框架及其CMMagnetometerData类为我们提供了以下属性:
@property(readonly, nonatomic) CMMagneticField magneticField
A structure containing 3-axis magnetometer data
typedef struct {
double x;
double y;
double z;
} CMMagneticField;
Run Code Online (Sandbox Code Playgroud)
我如何获得学位?或者是否还有其他方法(类/属性/方法)来获取磁力计的度数?
提前感谢任何有关此事的有用信息的人!:)
我正在尝试使用以下方法获得指数(即0-360)的指南针:
float[] mGravity;
float[] mGeomagnetic;
public void onSensorChanged(SensorEvent event) {
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);
float azimut = orientation[0];
bearing.setText("Bearing: "+ azimut);
}
}
}
Run Code Online (Sandbox Code Playgroud)
方位角值(即orientation[0])应为0 <=方位角<360但在旋转设备时,我只得到-3到3的值.有人可以告诉我可能会有什么问题吗?
我已经实现了旋转矢量和方向矢量的监听器,虽然我知道它已经折旧我想测试两者.
我知道旋转矢量是一个融合传感器并推荐但是根据它,NORTH(getOrientation返回的值[0](rotationMatrix,value)geaving bearing 0)与Orientation传感器的NORTH不匹配.我还从playstore的不同应用程序中得出结论,方向传感器值似乎更接近它们.
此外很多次我从Rotation_Vector的方位角值[0]然后getOrientation刚刚射击并保持在-180到180之间振荡
PS"getRotationMatrix(float [] R,float [] I,float [] gravity,float [] geomagnetic)"也给出与旋转向量相同的结果.
public final void onSensorChanged(SensorEvent event)
{
float rotationMatrix[];
switch(event.sensor.getType())
{
.
.
.
case Sensor.TYPE_ROTATION_VECTOR:
rotationMatrix=new float[16];
mSensorManager.getRotationMatrixFromVector(rotationMatrix,event.values);
determineOrientation(rotationMatrix);
break;
case Sensor.TYPE_ORIENTATION:
sensorZValue.setText(""+event.values[0]); //rotation about geographical z axis
sensorXValue.setText(""+event.values[1]); //rotation about geographical x axis
sensorYValue.setText(""+event.values[2]); //rotation about geographical y axis
}//switch case ends
}
private void determineOrientation(float[] rotationMatrix)
{
float[] orientationValues = new float[3];
SensorManager.getOrientation(rotationMatrix, orientationValues);
double azimuth = Math.toDegrees(orientationValues[0]);
double pitch = Math.toDegrees(orientationValues[1]); …Run Code Online (Sandbox Code Playgroud) android magnetometer digital-compass rotational-matrices android-sensors
有没有人知道Android上的方向传感器和磁场传感器之间的区别?
我的理解:
因为我读过磁力计是数字罗盘的代名词,我有点困惑.他们真的是什么?
经过几个小时的搜索,我很困惑,所以我现在告诉我学到了什么,所以如果我错了请纠正我:
光传感器:周围光线
磁传感器:我可以到达北方的位置.
加速度传感器:重力XYZ,地球重力或任何加速度.
接近传感器:就像停车传感器一样.
方向传感器:告诉XYZ度形成其轴.
我已经尝试过那些传感器使用Android市场上的一些应用程序,比如"我的传感器",我可以确认,如果你将手机在桌子上方旋转,加速计传感器感觉不到.方向传感器似乎抓住了所有的动作.现在我可以得出结论,罗盘应用程序使用磁传感器来查看北方的位置,然后使用方向传感器来了解您使用设备的位置,对吧?
在纵向和横向模式之间切换使用"加速计传感器"并检查哪个轴上的地球重力.
Q1:所以如果一切正常,什么是"陀螺仪"?和"方向传感器"一样吗?
Q2:大多数设备都可以使用方向传感器吗?
问题3:方向传感器的其他用途是什么?
问题4:为什么大多数网站甚至维基百科都说方向传感器==加速计传感器?
-Rami
我想创建一个增强现实视图,它将指向一个方向的对象.但是,当您面向相机时,CoreLocation标题无法正常工作(当您在一楼时,请指向20层楼的顶部).
它给出了相反的方向(可能是指向电话顶部的方向).
我尝试了一些方法让它适用于相机指向的方向,例如:
1,设备方向> 45度时+180度(不够准确,突然方向偏离10~20度)
2,尝试使用CMMotionManager使用以下教程中的公式进行计算. http://www.loveelectronics.co.uk/Tutorials/13/tilt-compensated-compass-arduino-tutorial.
3,尝试使用ios deviceMotion.magneticField和deviceMotion.gravity来模拟来自android的逻辑.
4,使用旋转矩阵(堆栈中的其他一些帖子溢出,但不准确)
double heading = M_PI + atan2(self.altitudeData.rotationMatrix.m22, self.altitudeData.rotationMatrix.m12);
heading = heading*180/M_PI;
Run Code Online (Sandbox Code Playgroud)
我不知道还有什么可以尝试让它正确.我知道有一些应用程序(一些可以看到太阳和星星的应用程序)正确地做到了.
作为机械罗盘的使用者,我注意到磁力计提供的航向经常偏离45度或更多,尽管在那种情况下没有出现校准显示.
如果我在室外测试或使用我的应用程序,我会在罗盘视图出现时校准磁力计.这是有效的,似乎这是必要的.
我不希望通过使用八字形动作执行频繁校准,在可能实现或多或少精确的标题时向我的应用程序的用户显示不准确的标题.
每次我的指南针视图出现时,是否有人知道强制显示磁力计校准视图的解决方案?
我在这里搜索了所有(?)帖子,只有一个人有类似的想法,但没有答案.
使用内置惯性测量单元(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
magnetometer ×10
android ×4
ios ×4
gyroscope ×2
objective-c ×2
orientation ×2
calibration ×1
heading ×1
iphone ×1
sensor ×1
trigonometry ×1