Android sensors

advertisement
Android sensors
•
•
Make new app.
In onCreate add
–
–
–
SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
List<Sensor> list = sensorManager.getSensorList(Sensor.TYPE_ALL);
for (Sensor s : list) {
•
–
List of sensors
Log.e("SENSORS","name: "+s.getName());
}
Nexus One Sensors
Nexus S Sensors
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
BMA150 3-axis Accelerometer
AK8973 3-axis Magnetic field sensor
AK8973 Orientation sensor
CM3602 Proximity sensor
CM3602 Light sensor
Linear Acceleration Sensor
Rotation Vector Sensor
API also supports
• pressure sensor (to help determine altitude)
KR3DM 3-axis Accelerometer
AK8973 3-axis Magnetic field sensor
AK8973 Orientation sensor
GP2A Proximity sensor
GP2A Light sensor
Linear Acceleration Sensor
Rotation Vector Sensor
K3G Gyroscope sensor
Gravity Sensor
compass
• New app: Compass
• Add member variables
– SensorManager sensorManager;
– Sensor compassSensor;
– MyCompassListener myCompassListener = new
MyCompassListener(); // we need to make this
MyCompassListener
• Make class
– class MyCompassListener implements
SensorEventListener {};
• Let eclipse add unimplemented functions
• In onSensorChanged(SensorEvent event), add
– Log.e("compass","x: "+event.values[0]+"y:
"+event.values[1]);
Register our sensor listener
• In onCreate, get sensor and register listener
– sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
– List<Sensor> list = sensorManager.getSensorList(Sensor.TYPE_ALL);
– for (Sensor s : list) {
• Log.e("SENSORS","name: "+s.getName()+" tpye: "+s.getType());
• if (s.getType()==Sensor.TYPE_MAGNETIC_FIELD) {
– Log.e("debuginfo","registering lin accel");
– compassSensor = s;
– sensorManager.registerListener(myCompassListener, s, sensorManager.SENSOR_DELAY_FASTEST);
• }
– }
• Run and see compass values
unregister and reregister
• Sensors will keep on creating events, so we must stop the
events when the app is not active
• In main activity
– @Override
– public void onPause() {
• super.onPause();
• sensorManager.unregisterListener(myCompassListener);
– }
– @Override
– public void onResume() {
• super.onResume();
• sensorManager.registerListener(myCompassListener, compassSensor,
sensorManager.SENSOR_DELAY_FASTEST);
– }
Draw compass
•
•
•
•
Recall simple drawing on a canvas lecture
In graphical editor, add “view” object.
Save
Go to xml and make the just made entry be of type
edu.udel.eleg454.MyView instead of View
– This requires replacing view and /view
• Make new class
– MyView that extends view
– Add
• public MyView(Context context, AttributeSet attrs) {
– super(context, attrs);
• }
• public MyView(Context context) {
– super(context);
• }
• In MyView, add member variables
– public float x=0;
– public float y=1;
– float scale;
• In onDraw, add
–
–
–
–
–
–
–
Paint paint = new Paint();
paint.setDither(true);
paint.setColor(Color.RED);
paint.setStyle(Paint.Style.FILL_AND_STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeCap(Paint.Cap.ROUND);
paint.setStrokeWidth(2);
• Now draw the compass
–
–
–
–
scale = (float) Math.sqrt(x*x+y*y); // normalize
x = x/scale*50;
y = y/scale*50;
canvas.drawLine(100,100,100+y,100+x, paint);
In Compass (our main activity class)
• In onCreate, get the view
– view = (MyView)findViewById(R.id.View01);
• In onSensorChanged(SensorEvent event), add
– view.x = event.values[0];
– view.y = event.values[1];
– view.invalidate(); // forces redraw
• run
•
•
More sensors - Proximity
Make new app (or maybe canalized Compass)
Add member variables
–
–
–
•
•
In onCreate() add,
if (s.getType()==Sensor.TYPE_PROXIMITY) {
–
•
•
•
SensorManager sensorManager;
Sensor sensor;
MySensorListener mySensorListener = new MySensorListener (); // we need to make this
Log.e("debuginfo","registering lin accel");
– compassSensor = s;
– sensorManager.registerListener(myCompassListener, s,
sensorManager.SENSOR_DELAY_FASTEST);
}
Make MySensorListener as we made MyCompassListener
In onSensorChanged add
–
if (event.sensor.getType()==Sensor.TYPE_PROXIMITY) {
•
–
Log.e("Proximity ","x: "+event.values[0]);
}
•
Run
•
Try with light sensor
–
Sensor.TYPE_LIGHT
•
•
•
Linear Accelerometer
Make a linear accelerometer listener
Register listener
Add member variable
–
•
MyLinearAccelerationListener myLinearAccelerationListener = new MyLinearAccelerationListener();
Add local class
–
–
–
class MyLinearAccelerationListener implements SensorEventListener { };
Let eclipse add unimplemented methods
Add class member variables
• double[] linear_acceleration = new double[3];
• double[] location = new double[3];
• double[] velocity = new double[3];
• long lastTimeStamp = 0;
• double timeDif;
– In onSensorChanged(SensorEvent event) // make sure arg is called event
–
–
–
–
–
–
if (event.sensor.getType()==10) {
if (lastTimeStamp>0) {
// to do: add a jetPlayer-based sounds
• timeDif = ((double)(event.timestamp - lastTimeStamp))/1e9;
• velocity[0] = velocity[0] + timeDif*event.values[0];
• velocity[1] = velocity[1] + timeDif*event.values[1];
• velocity[2] = velocity[2] + timeDif*event.values[2];
• location[0] = location[0] + timeDif*velocity[0];
• location[1] = location[1] + timeDif*velocity[1];
• location[2] = location[2] + timeDif*velocity[2];
• locationView.setText("location x: "+((double)((int)(location[0]*10.0)))/10.0+ " y: "+
((double)((int)(location[1]*10.0)))/10.0+" z: "+((double)((int)(location[2]*10.0)))/10.0);
• velocityView.setText("velocity x: "+((double)((int)(velocity[0]*10.0)))/10.0+ " y: "+
((double)((int)(velocity[1]*10.0)))/10.0+" z: "+((double)((int)(velocity[2]*10.0)))/10.0);
}
lastTimeStamp = event.timestamp;
}
accelerometer
•
Challenge: remove gravity from measurement
–
gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
–
–
–
gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];
scale = Math.sqrt(gravity[0]*gravity[0] + gravity[1]*gravity[1] +
gravity[2]*gravity[2])/SensorManager.GRAVITY_EARTH;
gravity[0] = gravity[0]/scale;
gravity[1] = gravity[1]/scale;
gravity[2] = gravity[2]/scale;
–
–
–
•
•
•
•
linear_acceleration[0] = event.values[0] - gravity[0];
linear_acceleration[1] = event.values[1] - gravity[1];
linear_acceleration[2] = event.values[2] - gravity[2];
SAME as linear accelerometer
todo
• Rotation sensor or gyroscope
– Show opengl image that rotates as phone rotates
• E.g., see navigator
– Allow phone to work as joystick
• Gesture recognition
– Hidden markov models
• Location tracking
– Keep history
– Gryoscope (to track gravity)
– Statistical signal processing
Download