190 likes | 504 Views
Android sensors. List of 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) {
E N D
List of sensors • Make new app. • In onCreate add • SensorManagersensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); • List<Sensor> list = sensorManager.getSensorList(Sensor.TYPE_ALL); • for (Sensor s : list) { • Log.e("SENSORS","name: "+s.getName()); • } • Nexus One 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 • Nexus S Sensors • 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 • API also supports • pressure sensor (to help determine altitude)
compass • New app: Compass • Add member variables • SensorManagersensorManager; • Sensor compassSensor; • MyCompassListenermyCompassListener = new MyCompassListener(); // we need to make this
MyCompassListener • Make class • class MyCompassListener implements SensorEventListener{}; • Let eclipse add unimplemented functions • In onSensorChanged(SensorEventevent), 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","registeringlinaccel"); • 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, AttributeSetattrs) { • 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 • SensorManagersensorManager; • Sensor sensor; • MySensorListenermySensorListener = new MySensorListener (); // we need to make this • In onCreate() add, • if (s.getType()==Sensor.TYPE_PROXIMITY) { • Log.e("debuginfo","registeringlinaccel"); • compassSensor= s; • sensorManager.registerListener(myCompassListener, s, sensorManager.SENSOR_DELAY_FASTEST); • } • Make MySensorListener as we made MyCompassListener • In onSensorChangedadd • 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 • MyLinearAccelerationListenermyLinearAccelerationListener = 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