发布日期:2022-10-09 点击率:44
加速度传感器,重力传感器,线性加速度传感器 第1张" title="android 加速传感器 重力传感器:android 加速度传感器,重力传感器,线性加速度传感器 第1张-传感器知识网"/>
加速度传感器检测物体倾角的原理
检物体倾角的一种常用方法是对陀螺仪输出的角速度进行积分。虽然这种方法直截了当,但误差会随着积分时间的增加而快速累积。在某些应用中,若整个时间范围内物体运动缓慢(忽略惯性力等因素的影响,物体只受重力作用),那么可以使用加速度计来测量物体的倾斜角度。该方法利用重力矢量及其在加速度计轴上的投影来确定倾斜角度。
以两轮平衡小车(倒立摆模型)为例,当检测到倾角存在时要控制小车以一定的加速度运动,才能维持平衡而不至于倒下。因此倾角的测量成为控制小车直立的关键。而在实际小车运动过程
package uni.sensor;
import java.util.Iterator;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Log;
public class SensorDemoActivity extends Activity {
//设置LOG标签
private static final String TAG="sensor";
private SensorManager sm;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//创建一个SensorManager来获取系统的传感器服务
sm=(SensorManager)getSystemService(Context.SENSOR_SERVICE);
//选取加速度感应器
int sensorType=Sensor.TYPE_ACCELEROMETER;
sm.registerListener(myAccelerometerListener,sm.getDefaultSensor(sensorType),SensorManager.SENSOR_DELAY_NORMAL);
}
final SensorEventListener myAccelerometerListener=new SensorEventListener(){
//复写onSensorChanged方法
public void onSensorChanged(SensorEvent sensorEvent){
if(sensorEvent.sensor.getType()==Sensor.TYPE_ACCELEROMETER){
Log.i(TAG,"onSensorChanged");
//图解中已经解释三个值的含义
float X_lateral=sensorEvent.values[0];
float Y_longitudinal=sensorEvent.values[1];
float Z_vertical=sensorEvent.values[2];
Log.i(TAG,"
heading "+X_lateral);
Log.i(TAG,"
pitch "+Y_longitudinal);
Log.i(TAG,"
roll "+Z_vertical);
}
}
//复写onAccuracyChanged方法
public void onAccuracyChanged(Sensor sensor , int accuracy){
Log.i(TAG, "onAccuracyChanged");
}
};
public void onPause(){
sm.unregisterListener(myAccelerometerListener);
super.onPause();
}
}
重力传感器与方向传感器的开发步骤类似,只要理清了期中的x,y,z的值之后就可以根据他们的变化来进行编程了,首先来看一副图
假设当地的重力加速度值为g
当手机正面朝上的时候,z的值为q,反面朝上的时候,z的值为-g
当手机右侧面朝上的时候,x的值为g,右侧面朝上的时候,x的值为-g
当手机上侧面朝上的时候,y的值为g,右侧面朝上的时候,y的值为-g
了解了重力传感器中X,Y,Z的含义之后下面我们就开始学习如何使用
首先我们创建一个传感器管理器和一个传感器监听器,管理器用来管理传感器以及创建各种各样的传感器,监听器用来监视传感器的变化并且进行相应的操作
private SensorManager sensorManager;
private MySensorEventListener mySensorEventListener;
mySensorEventListener=new MySensorEventListener();//这个监听器当然是我们自己定义的,在重力感 应器感应到手机位置有变化的时候,我们可以采取相应的操作,这里紧紧是将x,y,z的值打印出来
private final class MySensorEventListener implements SensorEventListener{
@Override
//可以得到传感器实时测量出来的变化值
public void onSensorChanged(SensorEvent event) {
//重力传感器
if(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){
float x=event.values[SensorManager.DATA_X];
float y=event.values[SensorManager.DATA_Y];
float z=event.values[SensorManager.DATA_Z];
//tv_accelerometer是界面上的一个TextView标签,不再赘述
tv_orientation.setText("Orientation:"+x+","+y+","+z);
}
}
我们在onResume方法中创建重力传感器,并向系统注册监听器
protected void onResume() {
Sensor sensor_accelerometer=sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorManager.registerListener(mySensorEventListener,sensor_accelerometer, SensorManager.SENSOR_DELAY_UI);
super.onResume();
}
最后我们在onPause()中注销所有传感器的监听,释放重力感应器资源!
protected void onPause() {
/注销所有传感器的监听
sensorManager.unregisterListener(mySensorEventListener);
super.onPause();
}
到此,有关重力传感器的介绍完毕!
重力感应主要是依靠手机的加速度传感器(accelerometer)来实现
在Android的开发中一共有八种传感器但是不一定每一款真机都支持这些传感器。因为很多功能用户根本不care的所以可能开发商会把某些功能屏蔽掉。还是得根据真机的实际情况来做开发,今天我们主要来讨论加速度传感器的具体实现方式。
传感器名称如下:
加速度传感器(accelerometer)
陀螺仪传感器(gyroscope)
环境光照传感器(light)
磁力传感器(magnetic field)
方向传感器(orientation)
压力传感器(pressure)
距离传感器(proximity)
温度传感器(temperature)
上面的是程序的运行图
遇到的问题:
1、当在与球相同的布局里面调用TextView时,球就不能移动了。最后我把球和数据分离开,用两个布局处理的。
2、不明白super.setframe()函数到底是什么意思
有哪位大神看懂了,告诉我一下
这个是主程序代码:
package cn.itcast.accelerometer;
import cn.itcast.accelerometer.view.BallView;
import android.app.Activity;
import android.graphics.Color;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class AccelerometerActivity extends Activity {
private static final float MAX_ACCELEROMETER=9.81f;
private SensorManager sensorManager;
private BallView ball;
private boolean success=false;
private boolean init=false;
private int container_width=0;
private int container_height=0;
private int ball_width=0;
private int ball_height=0;
private TextView prompt;
private TextView tv1;
private TextView tv2;
private TextView tv3;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//获取感应器管理器
sensorManager=(SensorManager) getSystemService(SENSOR_SERVICE);
prompt=(TextView) findViewById(R.id.ball_prompt);
tv1=(TextView)findViewById(R.id.tv1);
tv2=(TextView)findViewById(R.id.tv2);
tv3=(TextView)findViewById(R.id.tv3);
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {//ball_container控件显示出来后才能获取其宽和高,所以在此方法得到其宽高
super.onWindowFocusChanged(hasFocus);
if(hasFocus && !init){
View container=findViewById(R.id.ball_container);
container_width=container.getWidth();
container_height=container.getHeight();
ball=(BallView) findViewById(R.id.ball);
ball_width=ball.getWidth();
ball_height=ball.getHeight();
moveTo(0f, 0f);
init=true;
}
}
@Override
protected void onResume() {
Sensor sensor=sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);//获取重力加速度感应器
success=sensorManager.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_GAME);//注册listener,第三个参数是检测的精确度
super.onResume();
}
@Override
protected void onPause() {
if(success) sensorManager.unregisterListener(listener);
super.onPause();
}
private SensorEventListener listener=new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
if (!init) return ;
float x=event.values[SensorManager.DATA_X];
float y=event.values[SensorManager.DATA_Y];
float z=event.values[SensorManager.DATA_Z];
prompt.setText("X=" + x + ",Y=" + y + ", Z=" + z);
//当重力x,y为0时,球处于中心位置,以y为轴心(固定不动),转动手机,x会在(0-9.81)之间变化,负号代表方向
moveTo(-x, y);//x方向取反
if(x>0){
tv1.setTextColor(Color.WHITE);
tv1.setText("向左");
}
if(x
if(y
if(z<0){ tv3.setTextColor(Color.YELLOW); tv3.setText("向下"); } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } }; private void moveTo(float x, float y) { int max_x=(container_width - ball_width) / 2;//在x轴可移动的最大值 int max_y=(container_height - ball_height) / 2;//在y轴可移动的最大值 //手机沿x、y轴垂直摆放时,自由落体加速度最大为9.81,当手机沿x、y轴成某个角度摆放时,变量x和y即为该角度的加速度 float percentageX=x / MAX_ACCELEROMETER;//得到当前加速度的比率,如果手机沿x轴垂直摆放,比率为100%,即球在x轴上移动到最大值 float percentageY=y / MAX_ACCELEROMETER; int pixel_x=(int) (max_x * percentageX);//得到x轴偏移量 int pixel_y=(int) (max_y * percentageY);//得到y轴偏移量 //以球在中心位置的坐标为参考点,加上偏移量,得到球的对应位置,然后移动球到该位置 int x3=max_x + pixel_x;//屏幕中心位置+x轴偏移 int y3=max_y + pixel_y;//屏幕中心位置+y轴偏移 ball.moveTo(x3, y3); } } 球的代码移动: package cn.itcast.accelerometer.view; import android.content.Context; import android.util.AttributeSet; import android.widget.ImageView; public class BallView extends ImageView { public BallView(Context context) { super(context); } public BallView(Context context, AttributeSet attrs) { super(context, attrs); } public BallView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public void moveTo(int x, int y) {//没有弄明白什么意思,谁懂了告诉我一下啊,我加一个TextView,球就不能移动了 itas109 super.setframe(x, y, x + getWidth(), y + getHeight());//绘制视图,由左上角与右下角确定视图矩形位置 } } 整个程序的下载地址:
下一篇: PLC、DCS、FCS三大控
上一篇: 电气控制线路图控制原