最近我做了一些研究,使用加速度计+陀螺仪来使用那些传感器在没有GPS帮助的情况下跟踪智能手机(参见这篇文章) 基于陀螺仪和加速度计的室内定位系统
为此我需要我的方向(角度(俯仰,滚动等))所以这里到目前为止我所做的:
public void onSensorChanged(SensorEvent arg0) {
if (arg0.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
{
accel[0] = arg0.values[0];
accel[1] = arg0.values[1];
accel[2] = arg0.values[2];
pitch = Math.toDegrees(Math.atan2(accel[1], Math.sqrt(Math.pow(accel[2], 2) + Math.pow(accel[0], 2))));
tv2.setText("Pitch: " + pitch + "\n" + "Roll: " + roll);
} else if (arg0.sensor.getType() == Sensor.TYPE_GYROSCOPE )
{
if (timestamp != 0) {
final float dT = (arg0.timestamp - timestamp) * NS2S;
angle[0] += arg0.values[0] * dT;
filtered_angle[0] = (0.98f) * (filtered_angle[0] + arg0.values[0] * dT) + (0.02f)* (pitch); …Run Code Online (Sandbox Code Playgroud) 我希望获得Android手机的加速度矢量.问题是,加速度计坐标是相对于手机的旋转.我想要的是"绝对"加速度,即无论手机面对哪种方式,都应该返回相同的值.(我想检测一下滑雪的用户是否在不使用GPS的情况下滑下斜坡.我还需要能够区分滑行和上升的缆车.)
我可以通过将加速度计与陀螺仪相结合来获得这些值,但我不知道如何用陀螺仪来抵消加速度计的值.
这是可能的,如果是的话,怎么样?
我正在尝试为Android开发运动检测应用程序.应用程序应该能够跟踪手机在空间中的运动并将其映射到计算机屏幕上的运动.我正在使用3轴加速度计,因为数据非常嘈杂,我使用的是卡尔曼滤波器.
内部状态是6分量矢量[speed-x,speed-y,speed-z,accel-x,accel-y,accel-z],测量状态是3分量矢量[accel-x,accel-y,accel-z ].
滤波器在测量值上运行良好,但速度仍然非常嘈杂.

现在我想知道这是正常行为还是我做错了,因为我对卡尔曼滤波器的理解非常基础.我正在使用JKalman库并遵循状态转换矩阵(dt是1/15,这是近似的传感器刷新率)
double [] [] A = {{1,0,0,dt,0,0},{0,1,0,0,dt,0},{0,0,1,0,0,dt}, {0,0,0,1,0,0},{0,0,0,0,1,0},{0,0,0,0,0,1}};
我还建立了自己的协方差矩阵,其中协方差是根据测试数据计算出来的.这改善了加速度信号,但对速度没有影响.
目前我能够实现stdvar
[0,0632041857 0,0607274545 0,0886326602]用于速度[x,y,z]
[0,0041689678 0,004423822 0,0074808552]用于加速度[x,y,z].
我对加速度信号非常满意,我想我无法改善它,但我希望提高速度信号的质量.
我试图确定利用Android的线性加速数据的好处,而不是简单地应用Androids API参考中提供的低通滤波器,并在此其他stackoverflow问题中讨论.
我问我正试图获得一个记录线性加速的免费应用程序(以及我的其他要求(采样率,将数据写入文件等等)).我找不到一个,所以我考虑使用一个使用标准加速度计记录的应用程序然后我只是将低通滤波器应用于数据.或者,我可以编写自己的应用程序来完成我需要的工作 - 但我在Android开发方面没有太多经验,这需要一些时间.
我有一个拍照的应用程序.我希望在旋转设备时更改摄像机视图的方向,使图像以正确的方向显示出来.我希望即使设备方向被锁定也能正常工作.这样做的最佳方法是什么?加速度计/核心运动?非常感谢建议和教程.
长话短说
为什么我得到的加速度计值
Sensor.TYPE_ACCELEROMETER略有偏移?我指的不是重力,而是因轴和手机而异的一些小误差。我可以校准加速度计吗?或者是否有补偿这些错误的标准方法?
我正在开发一个应用程序,需要尽可能精确的加速度测量(主要是垂直加速度,即与重力方向相同)。
我做了很多测试,结果发现我得到的原始值Sensor.TYPE_ACCELEROMETER是错误的。如果我让手机完全水平放置且屏幕朝上,则加速计显示的 Z 值为 9.0,其应约为 9.81。同样,如果我将手机置于纵向或横向模式,X 和 Y 加速度计值显示约为 9.6。而不是 9.81。
这当然会影响我的垂直加速度,因为我正在使用 来SensorManager.getRotationMatrixFromVector()计算垂直加速度,导致垂直加速度根据设备的旋转而偏离不同的量。
现在,在有人抢先提出我应该尝试使用Sensor.TYPE_LINEAR_ACCELERATION替代方法之前,我必须指出我实际上也在这样做,与TYPE_ACCELERATION. 然后,通过使用重力传感器,我计算垂直加速度(如本答案中所述)。有趣的是,我得到的结果与使用原始加速度计SensorManager.getRotationMatrixFromVector()和矩阵乘法(最后减去重力)的方法完全相同。
我能够在任何旋转中为固定电话获得几乎完全为零的垂直加速度的唯一方法是获取原始加速度计值,添加偏移量(来自早期的观察,即 和)X+0.21,然后执行旋转矩阵内容以获得世界坐标系加速度。请注意,因为不仅仅是计算出的垂直加速度是错误的 - 它实际上是来自 的原始值,我认为它排除了陀螺仪传感器等其他误差源?Y+0.21Z+0.81Sensor.TYPE_ACCELEROMETER
我在两部不同的手机(三星 Galaxy S5 和索尼 Xperia Z3 紧凑型)上进行了测试,两者都有这些加速度计值偏差 - 但当然,两部手机上的值并不相同。
为什么 的值Sensor.TYPE_ACCELEROMETER会偏离,有没有更好的方法来“校准”加速度计,而不是简单地观察它们偏离重力的程度并在使用它们之前将差异添加到值中?
我有一个比视口大的图像,我正试图根据设备加速值在x计划上平移.
_____________________
| |
| Device |
| |
________|___________________|__________
| | | |
| | Image | |
| | | |
|_______|___________________|_________|
| |
| |
| |
| |
|___________________|
<-------------------->
X axis
Run Code Online (Sandbox Code Playgroud)
我可以得到半体面的结果,但没有什么比这更好的了.
根据我的理解,我需要:
到目前为止,我有类似的东西:(我正在使用gyronorm.js,因此调用加速度数据data.dm.x)
var accelX = data.dm.x
var currTrans = $('#pano').css('-webkit-transform').split(/[()]/)[1]
var posX = parseInt(currTrans.split(',')[4])
var newPos = posX+accelX
$('#pano').css({'-webkitfr-transform':'translateX('+(newPos)+'px)'})
Run Code Online (Sandbox Code Playgroud)
我觉得我在这里错过了一个核心概念,但经过几个小时的研究,我无法找到它.
通常,在Android中,我们通过覆盖OnSensorChanged函数来读取"Activity"中的加速度计数据.
我很好奇我们如何在"服务"中做到这一点.
谢谢,文森特
我想通过PyObjC访问我的iPhone的Accelerometer.这是我的代码:
@objc.signature("v@:@@")
def accelerometer_didAccelerate_(self, accelerometer, acceleration):
msgBox = UIAlertView.alloc().initWithTitle_message_delegate_cancelButtonTitle_otherButtonTitles_("Acceleration", str(acceleration.x), self, "OK", None)
msgBox.show()
msgBox.release()
@objc.signature("v@:@")
def applicationDidFinishLaunching_(self, unused):
self.accelerometer = UIAccelerometer.sharedAccelerometer()
self.accelerometer.setUpdateInterval_(1)
self.accelerometer.setDelegate_(self)
#...
Run Code Online (Sandbox Code Playgroud)
问题是str(accelleration.x)返回"<native-selector x of <UIAcceleration: 0x.....>>".我能做什么?
我是法国人,请原谅我的英语.所以我使用加速度计,但在我的代码中,加速度计适用于视图而不适用于图像.我想要做的是将此加速度计用于图像而不是视图.我怎样才能做到这一点?这是代码:
#define CONST_fps 100.
#define CONST_map_shift 0.01
#define kFilteringFactor 0.1
UIAccelerationValue rollingX, rollingY, rollingZ;
@implementation MapViewRotationViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// accelerometer settings
[[UIAccelerometer sharedAccelerometer] setDelegate:self];
[[UIAccelerometer sharedAccelerometer] setUpdateInterval:(1.0 / CONST_fps)];
}
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
rollingX = (acceleration.x * kFilteringFactor) + (rollingX * (1.0 - kFilteringFactor));
rollingY = (acceleration.y * kFilteringFactor) + (rollingY * (1.0 - kFilteringFactor));
rollingZ = (acceleration.z * kFilteringFactor) + (rollingZ * (1.0 - kFilteringFactor));
float accelX = acceleration.x - rollingX;
float accelY …Run Code Online (Sandbox Code Playgroud) accelerometer ×10
android ×6
gyroscope ×3
filter ×2
iphone ×2
camera ×1
filtering ×1
ios ×1
java ×1
javascript ×1
locked ×1
motionevent ×1
orientation ×1
physics ×1
pyobjc ×1
sensors ×1
service ×1
tracking ×1
trigonometry ×1
uiimageview ×1
xcode ×1