我想创建一个跟踪 android 中路径的应用程序。我使用以下代码来计算不同方向的加速度。
package com.example.usrivast.accelerometer;
import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
public class MainActivity extends Activity implements SensorEventListener{
Sensor accelerometer = null;
SensorManager sm = null;
TextView acceleration = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sm = (SensorManager)getSystemService(SENSOR_SERVICE);
accelerometer = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sm.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
acceleration = (TextView)findViewById(R.id.acceleration);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar …Run Code Online (Sandbox Code Playgroud) 要在 Android 中从欧拉角(例如俯仰、滚转、方位角)中获取方向,需要执行以下操作:
在第一个中,我意识到它使用了一种 TRIAD 算法;旋转矩阵(R[])由重力、地磁X重力、重力X(地磁X重力)---X为叉积组成。
请参阅以下代码:
float Ax = gravity[0];
float Ay = gravity[1];
float Az = gravity[2];
final float Ex = geomagnetic[0];
final float Ey = geomagnetic[1];
final float Ez = geomagnetic[2];
float Hx = Ey*Az - Ez*Ay;
float Hy = Ez*Ax - Ex*Az;
float Hz = Ex*Ay - Ey*Ax;
final float normH = (float)Math.sqrt(Hx*Hx + Hy*Hy + Hz*Hz);
if (normH < 0.1f) {
// device is …Run Code Online (Sandbox Code Playgroud) 我读过Javascript。监听 iPhone 震动事件?检测html5 mobile 中的晃动,这为检测手机“晃动”事件提供了一个很好的解决方案:
<script src="shake.js"></script>
<script>
var myShakeEvent = new Shake({threshold: 15, timeout: 1000});
myShakeEvent.start();
window.addEventListener('shake', function() { alert('shake!'); }, false);
</script>
Run Code Online (Sandbox Code Playgroud)
不幸的是,这似乎不适用于最新的 iOS 设备,并且此问题表明应为最新的 iOS 版本授予特殊权限。请注意,此处的代码不容易在 shake.js 库中使用。
问题:截至 2022 年,有哪种方法可以使用 Javascript 检测“摇动”事件,适用于主要浏览器(Firefox、Chrome、Safari)和移动设备(iOS、Android)?
如果首先出现一个请求许可的弹出窗口(例如请求地理定位请求许可的弹出窗口),那就可以了。
我为Blackberry开发应用程序.在Storm 1(4.7)和Storm 2(5.0)中,我需要在我的应用程序中禁用加速度计.我希望我的应用程序不会对加速度计做出反应,但这不会影响其他应用程序.这是可能的?
据我所知,我的应用程序应该在我使用XCode中的iPad模拟器时触发加速度计事件,但事实并非如此.
我已经google了一下,似乎加速计没有在模拟器中实现,这是正确的吗?如果是这样,为什么他们会有一个"硬件 - >摇动手势"菜单选项?
我的代码如下:
.h文件:
@interface MyViewController : UIViewController <UIPickerViewDataSource, UIPickerViewDelegate, UIAccelerometerDelegate>{
UIAccelerometer *accelerometer;
//...other stuff
}
@property (nonatomic, retain) UIAccelerometer *accelerometer;
@end
Run Code Online (Sandbox Code Playgroud)
那么.m文件:
@implementation MyViewController
@synthesize accelerometer;
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
NSLog(@"%@", [NSString stringWithFormat:@"%@%f", @"X: ", acceleration.x]);
NSLog(@"%@", [NSString stringWithFormat:@"%@%f", @"Y: ", acceleration.y]);
NSLog(@"%@", [NSString stringWithFormat:@"%@%f", @"Z: ", acceleration.z]);
}
- (void)viewDidLoad {
[super viewDidLoad];
self.accelerometer = [UIAccelerometer sharedAccelerometer];
self.accelerometer.updateInterval = .1;
self.accelerometer.delegate = self;
}
@end
Run Code Online (Sandbox Code Playgroud)
这看起来不错吗?
所以我使用HTC EVO获得加速度计数据.我得到这样的价值观.
967454610000 967534902000 967613576000 967692434000
这些值之间的差异大约是80,000,000.文档说:"该值必须是SENSOR_DELAY_NORMAL,SENSOR_DELAY_UI,SENSOR_DELAY_GAME或SENSOR_DELAY_FASTEST之一.或者,事件之间所需的延迟,以微秒为单位."
所以我使用的是SENSOR_DELAY_UI,我认为时间是微秒.这没有意义,因为这意味着每个时间间隔大约是80秒.如果它们以纳秒为单位意味着时间间隔约为0.08秒或每秒捕获12个数据,那将更有意义.但那会与文件相矛盾.有谁知道时间间隔是多少?
非常感谢!
美好的一天:)我正在研究从加速度计和陀螺仪获得俯仰,偏航和滚转角度的代码.为了创建一个易于理解的更清晰的代码,我使用了两个不同的功能.一个用于计算俯仰偏转和俯仰的陀螺仪,另一个用于加速度计也可以做同样的事情.
float *readGyro(){
/*get data from sensor here*/
float gyroAngles[4]={gyroPitch,gyroRoll,gyroYaw};
float* gyroPRY=gyroAngles;
return gyroPRY;
}
float *readAccel(){
/*get data from sensor here*/
float accelAngles[4]={accelPitch,accelRoll,accelYaw};
float* accelPRY=accelAngles;
return accelPRY;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我将函数的输出存储到一个数组中以传递给main函数.基本上指针被传递.但是,在从传递的指针访问值时,会打印常量垃圾值(不会随着我移动IMU而改变)(例如,2.38221e-44和-3.84146e-06).我通过打印这些函数中的值来检查陀螺仪和加速度计的功能输出,它们很好.
int main(void){
float *accelData;
float *gyroData;
while(1){
accelData=readGyro();
gyroData=readAccel();
float accelPitch=*(accelData);
float accelRoll=*(accelData+1);
float accelYaw=*(accelData+2);
float gyroPitch=*(gyroData);
float gyroRoll=*(gyroData+1);
float gyroYaw=*(gyroData+2);
cout << "AccelPitch=" << accelPitch <<endl;
cout << "AccelRoll=" << accelRoll <<endl;
cout << "AccelYaw=" << accelYaw <<endl;
cout << "GyroPitch=" << gyroPitch <<endl;
cout << "GyroRoll=" << gyroRoll …Run Code Online (Sandbox Code Playgroud) 我正在开发一个AR应用程序,需要根据设备的位置和方向移动图像.
似乎Game Rotation Vector应该提供必要的数据来实现这一目标.但是我似乎无法理解从GRV传感器获得的值是什么.例如,为了在Z轴上达到相同的值,我必须将设备旋转720度.这看起来很奇怪.
如果我能以某种方式将这些数字转换为从设备的参考系朝向x,y,z坐标的角度,我的问题就会得到解决.
我已经搜索了这个问题好几天了,没有找到关于GRV坐标含义以及如何使用它们的任何合理信息.
TL:DR GRV传感器的数量显示什么?以及如何将它们转换为角度?
我遇到了accelometer的问题.
如果设备平躺,我得到(0,0,-1),这显然是不对的.当我旋转手机时,这个-1会移动到其他轴,具体取决于手机的位置.
到目前为止,我的代码非常简单:
override func viewDidAppear(_ animated: Bool) {
motionManager.accelerometerUpdateInterval = 0.1
motionManager.startAccelerometerUpdates(to: OperationQueue.current!){(data,error)
in
if let myData = data {
print(Double(myData.acceleration.y) )
}
Run Code Online (Sandbox Code Playgroud) accelerometer ×10
android ×4
c++ ×2
gyroscope ×2
java ×2
arrays ×1
blackberry ×1
game-engine ×1
gravity ×1
ios ×1
ipad ×1
iphone ×1
javascript ×1
magnetometer ×1
mobile ×1
orientation ×1
pointers ×1
rotation ×1
sensor ×1
shake ×1
swift ×1
vector ×1