我需要在Android上以加速度计读取大约100个样本,并且采用固定的采样率.目前的传感器管理员既不提供也不提供.
他似乎可以访问使他的生活更轻松的驱动程序代码.
我很好奇是否有人能够通过NDK做这样的事情而没有那种知识.
提前致谢!
目前,我正在尝试使用方向传感器值使用getRotation()方法旋转3D立方体.当Android设备旋转到某些边界以上时,会观察到一些意外行为.例如,如果我让设备'站起来','roll'的价值就变得疯狂了.
此外,我正在经历类似于所谓的万向节锁定的现象.唯一的区别是,即使在将传感器值应用于3D旋转之前,我也遇到了这个问题.当我尝试通过仅围绕"俯仰"轴旋转设备来改变"俯仰"值时,"偏航"值也会根据俯仰的旋转而改变.这对我来说似乎完全不合理.
有人能帮帮我吗?我在这个问题上坚持了一个月.
我听了这个演讲:http: //www.youtube.com/watch?v = C7JQ7Rpwn2k
这是Invensense公司为其"传感器融合"系统进行原型设计,该系统将Android中的陀螺仪,加速度计,罗盘测量结合起来,以获得更好的效果.
这是当前在任何版本的Android中实现的吗?我问的原因是,传感器融合的一部分是"重力"传感器和"线性加速"传感器,自从API级别9以来在Android中实现...让我认为1)传感器融合实现2)传感器融合没有实现,但这些只是添加到Android API中,以期在未来广泛增加的sensorfusion实现.
有人知道吗?
谢谢
使用TYPE_MAGNETOMETER传感器时,可获得与器件方向相关的磁场强度的X,Y,Z值.我想要得到的是将这些值转换为全局参考框架,澄清:用户接受设备,测量这些值,而不是将设备旋转任何轴周围一定程度并获得相同的值.请在下面找到类似的问题: 在全局坐标中获取磁场值 如何获得磁场矢量,与设备旋转无关? 在这个答案中描述了样本解决方案(它用于线性加速,但我认为没关系):https://stackoverflow.com/a/11614404/2152255 我使用它并且我得到3个值,X总是非常小(不要认为它是正确的),Y和Z都可以,但是当我旋转设备时它们仍然有点变化.怎么可以调整?它可以全部解决吗?我使用简单的卡尔曼滤波器来近似测量值,因为即使设备根本没有移动/旋转,我也会得到不同的值.请在下面找到我的代码:
import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.opengl.Matrix;
import android.os.Bundle;
import android.view.View;
import android.widget.CheckBox;
import android.widget.TextView;
import com.test.statistics.filter.kalman.KalmanState;
import com.example.R;
/**
* Activity for gathering magnetic field statistics.
*/
public class MagneticFieldStatisticsGatheringActivity extends Activity implements SensorEventListener {
public static final int KALMAN_STATE_MAX_SIZE = 80;
public static final double MEASUREMENT_NOISE = 5;
/** Sensor manager. */
private SensorManager mSensorManager;
/** Magnetometer spec. */
private TextView vendor;
private TextView resolution; …Run Code Online (Sandbox Code Playgroud) 我需要从Sensor.TYPE_ORIENTATION获得的数据中计算出一个旋转矢量.
传感器数据定义如下:
我需要所有三个值,如Z轴值(从0到360度).我尝试了很多,但无法弄清楚如何做到这一点:/
(编辑:要查看工作代码背后的想法,请查看DroidAR框架的ActionWithSensorProcessing类,您可以看到如何处理不同的事件类型.)
我还尝试使用Sensor.TYPE_ACCELEROMETER和Sensor.TYPE_MAGNETIC_FIELD来自行计算这个3d矢量.这是代码:
final float[] inR = new float[16];
// load inR matrix from current sensor data:
SensorManager.getRotationMatrix(inR, null, gravityValues, geomagneticValues);
float[] orientation = new float[3];
SensorManager.getOrientation(inR, orientation);
mapMagAndAcclDataToVector(orientation); //here i do some *360 stuff
orientetionChanged(orientation); //then the correct values are passed (in theorie)
Run Code Online (Sandbox Code Playgroud)
但这不起作用,我认为这很复杂.所以我打赌有一个简单的解决方案,如何重新计算ensor.TYPE_ORIENTATION的值,使它们成为一个3d旋转矢量,但我只是不知道该怎么做.如果你知道答案,请告诉我.
编辑:我应该添加,我想将值传递给OpenGL,使其与轴对齐,如下所示:
gl.glRotatef(values[1], 1, 0, 0);
gl.glRotatef(values[2], 0, 1, 0);
gl.glRotatef(values[0], 0, 0, 1);
Run Code Online (Sandbox Code Playgroud)
但由于奇怪的价值范围,我显然无法做到这一点.与SensorManager.getOrientation中的值相同的问题,因为当您通过水平线时它们也会翻转.
另一个解决方案是使用inR矩阵计算角度,但我认为必须有一个更简单的解决方案(?)
我长期以来一直遇到这个问题.此代码应输出加速度计的dx,dy,dz以及dx的运行总和.它还应输出方位角,俯仰和滚动.
我已经使用了这里给出的信息,但无济于事.
此代码无法正确输出音高,方位角或滚动.它分别为最后三个文本视图输出0.0,-0.0,-0.0.
switch (event.sensor.getType()) {
case Sensor.TYPE_ACCELEROMETER:
accelerometerValues = event.values.clone();
case Sensor.TYPE_MAGNETIC_FIELD:
geomagneticMatrix = event.values.clone();
sensorReady = true;
break;
default:
break;
}
if (geomagneticMatrix != null && accelerometerValues != null && sensorReady) {
sensorReady = false;
float[] R = new float[16];
float[] I = new float[16];
SensorManager.getRotationMatrix(R, I, accelerometerValues, geomagneticMatrix);
float[] actual_orientation = new float[3];
SensorManager.getOrientation(R, actual_orientation);
tvXCoordinate.setText(accelerometerValues[0] + "");
tvYCoordinate.setText(accelerometerValues[1] + "");
tvZCoordinate.setText(accelerometerValues[2] + "");
floatXTotal += accelerometerValues[0];
tvXTotal.setText(floatXTotal + "");
tvAzimuth.setText(actual_orientation[0] + "");
tvPitch.setText(actual_orientation[1] + ""); …Run Code Online (Sandbox Code Playgroud) 我在ubuntu上使用eclipse + Android SDK.
我想打印传感器类型设备的名称,有很多他们,我想自动做.
如果我使用
Log.d("SENSORTYPE","Type: " + tempSensor.getType())
Run Code Online (Sandbox Code Playgroud)
我打印(int)类型,但我想使用枚举的名称.
我怎么能这样做?
提前解冻.
getPower()返回传感器在使用时使用的mA功率:
现在,我需要计算传感器配准使用了多少电池.
getPower()返回的值是否表示mAH(每小时mA)或其他?如果是,是否有办法获得电池mAH以计算传感器使用的电池百分比?
关于从加速度计数据中去除噪声,其他传感器数据,计算时空状态以及在Android和其他设备中使用卡尔曼滤波器存在很多问题.
显然,最简单的方法是在Android上实现JKalman过滤器,以便为汽车提供稳定的移动设备.
但是看看JKalman代码包中的示例实现,它并没有说太多,它实际上与其他Kalman实现非常不同.
他们像这样实例化一个卡尔曼类:
JKalman kalman = new JKalman(4, 2);
Run Code Online (Sandbox Code Playgroud)
根据定义在哪里
public JKalman(int dynam_params, int measure_params) throws Exception {
this(dynam_params, measure_params, 0);
}
Run Code Online (Sandbox Code Playgroud)
dynam_params是"测量向量维数"和measure_params是"状态向量维数".
如何将Android中读取的传感器数据映射到这些?
下面是加速度计的数据,每500ms采样一次.在其他听众中,有来自陀螺仪和指南针的数据.我该如何将这些数据转换为输入到卡尔曼?
@Override
public void onSensorChanged(SensorEvent event) {
actualTime = System.currentTimeMillis();
if(actualTime - lastUpdateAcc < 500)
return;
else{
lastUpdateAcc = actualTime;
//update myPosition
TextView tv = (TextView)findViewById(R.id.textView3);
tv.setText(String.format("X: %8.4f -- Y: %8.4f -- Z: %8.4f",
event.values[0], event.values[1], event.values[2]));
//draw on the screen
//draw new path, if one exists
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试读取超声波传感器(HC-SR04)的距离,但我得到的唯一值是0和265.xx.
我正在使用安装了Windows 10 IoT Core的Raspberry Pi 2.
我用C#编写了代码.
这是超声波传感器类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;
using Windows.Devices.Gpio;
namespace RaspberryPi
{
class UcSensor
{
GpioController gpio = GpioController.GetDefault();
GpioPin TriggerPin;
GpioPin EchoPin;
//Contructor
public UcSensor(int TriggerPin, int EchoPin)
{
//Setting up gpio pin's
this.TriggerPin = gpio.OpenPin(TriggerPin);
this.EchoPin = gpio.OpenPin(EchoPin);
this.TriggerPin.SetDriveMode(GpioPinDriveMode.Output);
this.EchoPin.SetDriveMode(GpioPinDriveMode.Input);
this.TriggerPin.Write(GpioPinValue.Low);
}
public double GetDistance()
{
ManualResetEvent mre = new ManualResetEvent(false);
mre.WaitOne(500);
//Send pulse
this.TriggerPin.Write(GpioPinValue.High);
mre.WaitOne(TimeSpan.FromMilliseconds(0.01));
this.TriggerPin.Write(GpioPinValue.Low);
//Recieve pusle
while (this.EchoPin.Read() == …Run Code Online (Sandbox Code Playgroud) sensor ×10
android ×9
java ×3
matrix ×2
android-ndk ×1
c# ×1
enums ×1
events ×1
gravity ×1
gyroscope ×1
iot ×1
magnetometer ×1
opengl-es ×1
orientation ×1
rotation ×1
vector ×1
windows-10 ×1