获取方向盘角度传感器传感器

&近年来,在发改委的支持下,中国地震局开始组织基于下一代互联网络技术的地震加速度传感器的研制工作。新型的地震加速度传感系统,改变过去布设加速度传感器用于场地观测和城市规划的传统场地观测思想,把系统的功能定位在快速实时获取城市地震动和烈度分布区域和为救灾减灾服务上,制定了&方便联网、安装简便、海量部署、快速反应&指导思想,要求研制的加速度传感器要有消费电子产品的简单、耐用和便宜特性,可以适当降低仪器的灵敏度(针对较大地震),组网后数据汇集产生规模效益。
新型地震加速度传感器,采用传感器和控制系统一体化的设计,传感器采用低功耗微型电子电容式加速度传感器,控制系统使用嵌入式系统,配置了数据采集、电源、授时、通信等模块,具备有线、无线的多种通信功能,可以在室内外进行大量的布设,通过多种方式联网,可及时将数据传回处理中心进行实时处理。
加速度传感器是一种能够测量加速力的电子设备。加速力就是当物体在加速过程中作用在物体上的力,就好比地球引力,也就是重力。加速力可以是个常量,比如g,也可以是变量。加速度传感器有两种:一种是角加速度传感器,是由陀螺仪(角速度传感器)的改进的。另一种就是线加速度传感器。
加速度传感器和陀螺仪通常称为惯性传感器,常用于各种设备或终端中实现姿态检测,运动检测等,也就很适合玩体感游戏的人群。加速度传感器利用重力加速度,可以用于检测设备的倾斜角度,但是它会受到运动加速度的影响,使倾角测量不够准确,所以通常需利用陀螺仪和磁传感器补偿。同时磁传感器测量方位角时,也是利用地磁场,当系统中电流变化或周围有导磁材料时,以及当设备倾斜时,测量出的方位角也不准确,这时需要用加速度传感器(倾角传感器)和陀螺仪进行补偿。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
与非门科技(北京)有限公司 All Rights Reserved.
京ICP证:070212号
北京市公安局备案编号: 京ICP备:号8107人阅读
Android(35)
一般情况下,在android系统中获取手机的方位信息在api中有TYPE_ORIENTATION常量,可以像得到加速度传感器那样得到方向传感器sm.getDefaultSensor(Sensor.TYPE_ORIENTATION);然而我们这样做的话在最新版的SDK中就会看到这么一句话:“TYPE_ORIENTATION
constant is deprecated. use SensorManager.getOrientation() instead. ”即这种方式也过期,不建议使用!Google建议我们在应用程序中使用SensorManager.getOrientation()来获得原始数据。
public static float[] getOrientation (float[] R, float[] values)
第一个参数是R[] 是一个旋转矩阵,用来保存磁场和加速度的数据,可以理解为这个函数的传入值,通过它这个函数给你求出方位角。
第二个参数就是这个函数的输出了,他有函数自动为我们填充,这就是我们想要的。
:方向角,但用(磁场+加速度)得到的数据范围是(-180~180),也就是说,0表示正北,90表示正东,180/-180表示正南,-90表示正西。而直接通过方向感应器数据范围是(0~359)360/0表示正北,90表示正东,180表示正南,270表示正西。
pitch 倾斜角
即由静止状态开始,前后翻转,手机顶部往上抬起(0~-90),手机尾部往上抬起(0~90)
roll 旋转角 即由静止状态开始,左右翻转,手机左侧抬起(0~90),手机右侧抬起(0~-90)
现在问题是这个R[]怎么获取,其实他是通过函数getRotationMatrix得到的。
看看getRotationMatrix的定义:
public static boolean getRotationMatrix (float[] R, float[] I, float[] gravity, float[] geomagnetic)
解释以下参数,第一个就是我们需要填充的R数组,大小是9
第二个是是一个转换矩阵,将磁场数据转换进实际的重力坐标中 一般默认情况下可以设置为null
第三个是一个大小为3的数组,表示从加速度感应器获取来的数据
在onSensorChanged中
第四个是一个大小为3的数组,表示从磁场感应器获取来的数据
在onSensorChanged中
示例代码:
package com.example.
import android.app.A
import android.hardware.S
import android.hardware.SensorE
import android.hardware.SensorEventL
import android.hardware.SensorM
import android.os.B
import android.view.M
import android.widget.TextV
//实现传感器事件监听:SensorEventListener
public class MainActivity extends Activity implements SensorEventListener{
private SensorManager sensorM
private Sensor acc_
private Sensor mag_
//加速度传感器数据
float accValues[]=new float[3];
//地磁传感器数据
float magValues[]=new float[3];
//旋转矩阵,用来保存磁场和加速度的数据
float r[]=new float[9];
//模拟方向传感器的数据(原始数据为弧度)
float values[]=new float[3];
TextView show_change=
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
show_change=(TextView) findViewById(R.id.show_change);
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
acc_sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mag_sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
//给传感器注册监听:
sensorManager.registerListener(this, acc_sensor, SensorManager.SENSOR_DELAY_GAME);
sensorManager.registerListener(this, mag_sensor,SensorManager.SENSOR_DELAY_GAME);
public boolean onCreateOptionsMenu(Menu menu) {
// I this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
//传感器状态改变时的回调方法
public void onSensorChanged(SensorEvent event) {
if(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){
accValues=event.values.clone();//这里是对象,需要克隆一份,否则共用一份数据
else if(event.sensor.getType()==Sensor.TYPE_MAGNETIC_FIELD){
magValues=event.values.clone();//这里是对象,需要克隆一份,否则共用一份数据
/**public static boolean getRotationMatrix (float[] R, float[] I, float[] gravity, float[] geomagnetic)
* 填充旋转数组r
* r:要填充的旋转数组
* I:将磁场数据转换进实际的重力坐标中 一般默认情况下可以设置为null
* gravity:加速度传感器数据
* geomagnetic:地磁传感器数据
SensorManager.getRotationMatrix(r, null, accValues, magValues);
* public static float[] getOrientation (float[] R, float[] values)
* R:旋转数组
* values :模拟方向传感器的数据
SensorManager.getOrientation(r, values);
//将弧度转化为角度后输出
StringBuffer buff=new StringBuffer();
for(float value:values){
value=(float) Math.toDegrees(value);
buff.append(value+"
show_change.setText(buff.toString());
public void onAccuracyChanged(Sensor sensor, int accuracy) {方向传感器 - 简书
方向传感器
可以使用与光照传感器类似的方法:
Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
但 Android 早就废弃了 Sensor.TYPE_ORIENTATION 这种传感器类型,不再推荐这样写了。
事实上,Android 获取手机旋转的方向和角度是通过加速度传感器和地磁传感器共同计算得出的。
一、方向传感器的用法
1. 获取 SensorManager 实例。
SensorManager senserManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
2. 通过 getDefaultSensor() 得到加速度传感器和地磁传感器的实例。
Sensor accelerometerSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
Sensor magneticSensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
3. 借助 SensorEventListener 对传感器输出的信号进行监听。
SensorEventListener listener = new SensorEventListener() {
public void onAccuracyChanged(Sensor sensor, int accuracy) {
public void onSensorChanged(SensorEvent event) {
4. 调用 SensorManager 的 registerListener() 方法来注册SensorEventListener 使其生效。
sensorManager.registerListener(listener, accelerometerSensor, SensorManager.SENSOR_DELAY_GAME);
sensorManager.registerListener(listener, magneticSensor, SensorManager.SENSOR_DELAY_GAME);
由于方向传感器的精确度要求通常都比较高,这里把传感器输出信息的更新速率提高了一些,使用的是 SENSOR_DELAY_GAME。
5. 在 onSensorChanged() 方法中可以获取到 SensorEvent 的 values 数组,分别记录着加速度传感器和地磁传感器输出的值。然后将这两个值传入到 SensorManager 的 getRotationMatrix() 方法中就可以得到一个包含旋转矩阵的 R 数组。
SensorManager.getRotationMatrix(R, null, accelerometerValues, magneticValues);
第一个参数:R 是一个长度为 9 的 float 数组,getRotationMatrix() 方法计算出的旋转数据就会赋值到这个数组当中。
第二个参数:用于将地磁向量转换成重力坐标的旋转矩阵,通常指定为 null 即可。
第三个参数:加速度传感器输出的 values 值。
第四个参数:地磁传感器输出的 values 值。
6. 调用 SensorManager 的 getOrientation() 方法来计算手机的旋转数据。
SensorManager.getOrientation(R, values);
values 是一个长度为 3 的 float 数组,手机在各个方向上的旋转数据都会被存放到这个数组当中。
values[0] 记录着手机围绕** Z 轴**的旋转弧度。
values[1] 记录着手机围绕** X 轴**的旋转弧度。
values[2] 记录着手机围绕 Y 轴的旋转弧度。
7. 将弧度转换为角度。
Math.toDegrees(values[0]);
8. 最后调用 unregisterListener() 方法将使用的资源释放掉。
sensorManager.unregisterListener(listener);
二、制作简易指南针
public class MainActivity extends Activity {
private SensorManager sensorM
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
Sensor magneticSensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
Sensor accelerometerSensor = sensorManager.getDefaultSensor(
Sensor.TYPE_ACCELEROMETER);
sensorManager.registerListener(listener, magneticSensor,
SensorManager.SENSOR_DELAY_GAME);
sensorManager.registerListener(listener, accelerometerSensor,
SensorManager.SENSOR_DELAY_GAME);
protected void onDestroy() {
super.onDestroy();
if (sensorManager != null) {
sensorManager.unregisterListener(listener);
private SensorEventListener listener = new SensorEventListener() {
float[] accelerometerValues = new float[3];
float[] magneticValues = new float[3];
public void onSensorChanged(SensorEvent event) {
// 判断当前是加速度传感器还是地磁传感器
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
// 注意赋值时要调用clone()方法
accelerometerValues = event.values.clone();
} else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
// 注意赋值时要调用clone()方法
magneticValues = event.values.clone();
float[] R = new float[9];
float[] values = new float[3];
SensorManager.getRotationMatrix(R, null, accelerometerValues, magneticValues);
SensorManager.getOrientation(R, values);
Log.d("MainActivity", "value[0] is " + Math.toDegrees(values[0]));
public void onAccuracyChanged(Sensor sensor, int accuracy) {
注意在赋值的时候一定要调用一下 values 数组的 **clone() **方法,不
然 accelerometerValues 和 magneticValues 将会指向同一个引用。
Android传感器定义 Android 传感器相关术语微机电传感器(MEMS)MEMS 通常制作在规格很小的硅芯片上,借用了计算机芯片的制作技术。通常来说,所有的 Android 传感器都使用了这些技术,但是从技术的角度来说,MEMS 指的是在该传感器的部分设计中纳入了物...
传感器 传感器Sensor是一种检测装置,能感受到被测量的信息,并能将感受到的信息,按一定规律变换成为电信号或其他所需形式的信息输出,以满足信息的传输、处理、存储、显示、记录和控制等要求。 中国物联网校企联盟认为,传感器的存在和发展,让物体有了触觉、味觉和嗅觉等感官,让物体...
简单指南针的实现:将方向传感器的第一个参数(与正北方的夹角)传递给图片,进行旋转动画反向相等的角度 水平仪:将方向传感器返回的底部、右侧翘起角度传给气泡图片,控制其在屏幕上的位置
1方向传感器在方向传感器中values变量的3个值都表示度数,它们的含义如下:values[0]:该值表示方位,也就是手机绕着Z轴旋转的角度。0表示北(North);90表示东(East);180表示南(South);270表示西(West)。如果values[0]的值正好...
2004年机缘巧合小叶应聘为一名大学老师。当时有人问,你是凭关系进来的吗?小叶听出了玄外之音,看来不少人都是凭关系进来的。但小叶骄傲地说:“我不是!”同一批被录用的老师里有个姑娘,在一起住宿时,她问了小叶一句:“你是北京人,你觉得你有优越感吗?”小叶不知道怎么回答这个问题。...
心如雪莲花,人似玉芙蓉。 沉疴侵壮年,伉俪情意浓。 祈祷早痊愈,放生把佛恭。 愿比翼连枝,笃感誓苍穹。 网友心如莲花的夫君,壮年患了癌症,她为了夫君做出的种种努力,感动了很多网友,祝心如莲花的夫君早日康复!
我正不可阻挡的成为那种对所谓的对错概念,越来越模糊的人。
以前的我不是这样的。很多中国人也不是这样的。我们从小熟悉的主要教育模式就是对错教育。多开放的问题,老师居然都特么的 可以给你一个正确答案!那么所谓的正确答案之外,其他那些也非常有道理的答案呢?对不起 负...
大学时,一个挺喜欢的姑娘从外面旅游回来,由我去校门口接。那时候夏夜清风习习,心情也随着风在校园里飘荡。我突然意识到,还没帮她庆祝过生日,于是顺口问她:“你生日是什么时候?”她却回答:“告诉过你啊。”我才发现,上一次和她深聊都是一年前的事了。一年前的事情,对我来说当然不可能记...
前几天,微博上看到一个视频,一名男子疑似向女友当众求婚,结局却出人意料,没有激动的流泪,没有幸福的拥抱,更没有忘情的热吻,而是女子在路边扯着嗓子大喊: “你家连个厕所都没有,连个洗澡的地方都没有,你叫我嫁给你啊,你太可笑了!” 视频中的女子看不清具体长相,但是大致形象是清楚...Android利用方向传感器获得手机的相对角度实例说明_Android
作者:用户
本文讲的是Android利用方向传感器获得手机的相对角度实例说明_Android,
1.android 的坐标系是如何定义x, y z 轴的 x轴的方向是沿着屏幕的水平方向从左向右,如果手机不是正方形的话,较短的边需要水平放置,较长的边需要垂直放置。Y轴的方向是从屏幕的左下角开始沿着屏幕的的垂直方向指向屏幕的顶端。 将手
1.android 的坐标系是如何定义x, y z 轴的 x轴的方向是沿着屏幕的水平方向从左向右,如果手机不是正方形的话,较短的边需要水平放置,较长的边需要垂直放置。Y轴的方向是从屏幕的左下角开始沿着屏幕的的垂直方向指向屏幕的顶端。 将手机放在桌子上,z轴的方向是从手机指向天空。 2.方向传感器 在方向传感器中values变量的3个值都表示度数,它们的含义如下: values[0]:该值表示方位,也就是手机绕着Z轴旋转的角度。0表示北(North);90表示东(East);180表示南(South);270表示西(West)。如果values[0]的值正好是这4个值,并且手机是水平放置,表示手机的正前方就是这4个方向。可以利用这个特性来实现电子罗盘,实例76将详细介绍电子罗盘的实现过程。 values[1]:该值表示倾斜度,或手机翘起的程度。当手机绕着X轴倾斜时该值发生变化。values[1]的取值范围是-180≤values[1]≤180。假设将手机屏幕朝上水平放在桌子上,这时如果桌子是完全水平的,values[1]的值应该是0(由于很少有桌子是绝对水平的,因此,该值很可能不为0,但一般都是-5和5之间的某个值)。这时从手机顶部开始抬起,直到将手机沿X轴旋转180度(屏幕向下水平放在桌面上)。在这个旋转过程中,values[1]会在0到-180之间变化,也就是说,从手机顶部抬起时,values[1]的值会逐渐变小,直到等于-180。如果从手机底部开始抬起,直到将手机沿X轴旋转180度,这时values[1]会在0到180之间变化。也就是values[1]的值会逐渐增大,直到等于180。可以利用values[1]和下面要介绍的values[2]来测量桌子等物体的倾斜度。values[2]:表示手机沿着Y轴的滚动角度。取值范围是-90≤values[2]≤90。假设将手机屏幕朝上水平放在桌面上,这时如果桌面是平的,values[2]的值应为0。将手机左侧逐渐抬起时,values[2]的值逐渐变小,直到手机垂直于桌面放置,这时values[2]的值是-90。将手机右侧逐渐抬起时,values[2]的值逐渐增大,直到手机垂直于桌面放置,这时values[2]的值是90。在垂直位置时继续向右或向左滚动,values[2]的值会继续在-90至90之间变化。 下面以一个实例说明其应用方法
复制代码 代码如下:
package com.example. import java.util.L import android.app.A import android.hardware.S import android.hardware.SensorE import android.hardware.SensorEventL import android.hardware.SensorM import android.os.B import android.util.L import android.view.M import android.view.V import android.view.View.OnClickL import android.widget.B import android.widget.TextV public class SensorTest extends Activity implements SensorEventListener{ private SensorManager sensorManager = private Sensor gyroSensor = private TextView vX; private TextView vY; private TextView vZ; private TextV private B private static final float NS2S = 1.0f / .0f; pri private float[] angle = new float[3]; @SuppressWarnings("deprecation") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sensor_test); vX = (TextView) findViewById(R.id.vx); vY = (TextView)findViewById(R.id.vy); vZ = (TextView)findViewById(R.id.vz); v = (TextView)findViewById(R.id.v); button = (Button)findViewById(R.id.button); sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); gyroSensor = sensorManager .getDefaultSensor(Sensor.TYPE_ORIENTATION); vX.setText("!!!!!!"); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub //声明可变字符串 StringBuffer sb = new StringBuffer(); //获取手机全部的传感器 List&Sensor& sensors = sensorManager.getSensorList(Sensor.TYPE_ALL); //迭代输出获得上的传感器 for (Sensor sensor : sensors) { //System.out.println(sensor.getName().toString()); sb.append(sensor.getName().toString()); sb.append("\n"); Log.i("Sensor", sensor.getName().toString()); } //给文本控件赋值 v.setText(sb.toString()); } }); } public SensorTest() { // TODO Auto-generated constructor stub angle[0] = 0; angle[1] = 0; angle[2] = 0; timestamp = 0; } @Override public boolean onCreateOptionsMenu(Menu menu) { // I this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_sensor_test, menu);
} @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); sensorManager.unregisterListener(this); // 解除监听器注册 } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); sensorManager.registerListener(this, gyroSensor, SensorManager.SENSOR_DELAY_NORMAL); //为传感器注册监听器 } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // TODO Auto-generated method stub } @Override public void onSensorChanged(SensorEvent event) { // TODO Auto-generated method stub // if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) // { // // } // if (timestamp != 0) { // final float dT = (event.timestamp - timestamp) * NS2S; // angle[0] += event.values[0] * dT * 100; // angle[1] += event.values[1] * dT * 100; // angle[2] += event.values[2] * dT * 100; // } // timestamp = event. // // // vX.setText("X: " + Float.toString(angle[0])); // vY.setText("Y: " + Float.toString(angle[1])); // vZ.setText("Z: " + Float.toString(angle[2])); // 方向传感器提供三个数据,分别为azimuth、pitch和roll。 // // azimuth:方位,返回水平时磁北极和Y轴的夹角,范围为0°至360°。 // 0°=北,90°=东,180°=南,270°=西。 // // pitch:x轴和水平面的夹角,范围为-180°至180°。 // 当z轴向y轴转动时,角度为正值。 // // roll:y轴和水平面的夹角,由于历史原因,范围为-90°至90°。 // 当x轴向z轴移动时,角度为正值。 vX.setText("Orientation X: " + event.values[0]); vY.setText("Orientation Y: " + event.values[1]); vZ.setText("Orientation Z: " + event.values[2]); } }
布局文件如下:
复制代码 代码如下:
&LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".SensorTest" android:orientation="vertical" & &Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="获取传感器" /& &TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/v" android:textSize="30px" &&/TextView& &TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/vx" android:textSize="50px" /& &TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/vy" android:textSize="50px" /& &TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/vz" android:textSize="50px" /& &/LinearLayout&
以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索方向传感器
角度传感器、角度位移传感器、角度传感器工作原理、霍尔角度传感器、传感器应用实例,以便于您获取更多的相关知识。
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率
40+云计算产品,6个月免费体验
稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一
云服务器9.9元/月,大学必备
云栖社区(yq.aliyun.com)为您免费提供相关信息,包括
,所有相关内容均不代表云栖社区的意见!传感器作用及其发展方向_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
传感器作用及其发展方向
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
你可能喜欢

我要回帖

更多关于 手机方向传感器 的文章

 

随机推荐