0.18: Camera calibration and LaserScan Info refactoring (#324)

* Saving full camera calibration in database, added angle min/max/inc to LaserScan.

* Updated laserscan info save/load in db

* Database: added Tag table, added env_sensors field to Node

* fixed serialization/deserialization of stereo camera model

* fixed multi-calibration db saving

* fixed rebase errors

* Tango: Added saving environmental sensors option

* Memory: Save env sensors

* Tango: fixed env sensor ids

* DBViewer: show env sensors values

* DBViewer: added calibration details on tooltip

* increased package version to 0.18.0

* Fixed LaserScan copies when angleIncrement is valid

* fixed build error without OctoMap dependency
This commit is contained in:
matlabbe
2018-10-23 14:35:14 -04:00
committed by GitHub
parent 8701ae6de0
commit 8e99291e13
51 changed files with 2063 additions and 491 deletions
@@ -13,6 +13,8 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.app.ActivityManager;
@@ -45,6 +47,8 @@ import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.net.Uri;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.os.Environment;
@@ -192,14 +196,23 @@ public class RTABMapActivity extends Activity implements OnClickListener, OnItem
private String mMinInliers;
private String mMaxOptimizationError;
private boolean mGPSSaved = false;
private boolean mEnvSensorsSaved = false;
private LocationManager mLocationManager;
private LocationListener mLocationListener;
private Location mLastKnownLocation;
private SensorManager mSensorManager;
private WifiManager mWifiManager;
private Timer mEnvSensorsTimer = new Timer();
Sensor mAccelerometer;
Sensor mMagnetometer;
Sensor mAmbientTemperature;
Sensor mAmbientLight;
Sensor mAmbientAirPressure;
Sensor mAmbientRelativeHumidity;
private float mCompassDeg = 0.0f;
private float[] mLastEnvSensors = new float[5];
private boolean[] mLastEnvSensorsSet = new boolean[5];
private float[] mLastAccelerometer = new float[3];
private float[] mLastMagnetometer = new float[3];
@@ -220,8 +233,8 @@ public class RTABMapActivity extends Activity implements OnClickListener, OnItem
private AlertDialog mMemoryWarningDialog = null;
private final int STATUS_TEXTS_SIZE = 19;
private final int STATUS_TEXTS_POSE_INDEX = 5;
private final int STATUS_TEXTS_SIZE = 20;
private final int STATUS_TEXTS_POSE_INDEX = 6;
private String[] mStatusTexts = new String[STATUS_TEXTS_SIZE];
GestureDetector mGesDetect = null;
@@ -517,8 +530,13 @@ public class RTABMapActivity extends Activity implements OnClickListener, OnItem
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mMagnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
mAmbientTemperature = mSensorManager.getDefaultSensor(Sensor.TYPE_AMBIENT_TEMPERATURE);
mAmbientLight = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
mAmbientAirPressure = mSensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE);
mAmbientRelativeHumidity = mSensorManager.getDefaultSensor(Sensor.TYPE_RELATIVE_HUMIDITY);
float [] values = {1,0,0,0,0,1,0,-1,0};
mDeviceToCamera.setValues(values);
mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
setCamera(1);
@@ -527,25 +545,52 @@ public class RTABMapActivity extends Activity implements OnClickListener, OnItem
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor == mAccelerometer) {
System.arraycopy(event.values, 0, mLastAccelerometer, 0, event.values.length);
mLastAccelerometerSet = true;
} else if (event.sensor == mMagnetometer) {
System.arraycopy(event.values, 0, mLastMagnetometer, 0, event.values.length);
mLastMagnetometerSet = true;
}
if (mLastAccelerometerSet && mLastMagnetometerSet) {
SensorManager.getRotationMatrix(mR, null, mLastAccelerometer, mLastMagnetometer);
mRMat.setValues(mR);
mNewR.setConcat(mRMat, mDeviceToCamera) ;
mNewR.getValues(mR);
SensorManager.getOrientation(mR, mOrientation);
mCompassDeg = mOrientation[0] * 180.0f/(float)Math.PI;
if(mCompassDeg<0.0f)
{
mCompassDeg += 360.0f;
}
}
if(event.sensor == mAccelerometer || event.sensor == mMagnetometer)
{
if (event.sensor == mAccelerometer) {
System.arraycopy(event.values, 0, mLastAccelerometer, 0, event.values.length);
mLastAccelerometerSet = true;
} else if (event.sensor == mMagnetometer) {
System.arraycopy(event.values, 0, mLastMagnetometer, 0, event.values.length);
mLastMagnetometerSet = true;
}
if (mLastAccelerometerSet && mLastMagnetometerSet) {
SensorManager.getRotationMatrix(mR, null, mLastAccelerometer, mLastMagnetometer);
mRMat.setValues(mR);
mNewR.setConcat(mRMat, mDeviceToCamera) ;
mNewR.getValues(mR);
SensorManager.getOrientation(mR, mOrientation);
mCompassDeg = mOrientation[0] * 180.0f/(float)Math.PI;
if(mCompassDeg<0.0f)
{
mCompassDeg += 360.0f;
}
}
}
else if(event.sensor == mAmbientTemperature)
{
mLastEnvSensors[1] = event.values[0];
mLastEnvSensorsSet[1] = true;
RTABMapLib.addEnvSensor(2, event.values[0]);
}
else if(event.sensor == mAmbientAirPressure)
{
mLastEnvSensors[2] = event.values[0];
mLastEnvSensorsSet[2] = true;
RTABMapLib.addEnvSensor(3, event.values[0]);
}
else if(event.sensor == mAmbientLight)
{
mLastEnvSensors[3] = event.values[0];
mLastEnvSensorsSet[3] = true;
RTABMapLib.addEnvSensor(4, event.values[0]);
}
else if(event.sensor == mAmbientRelativeHumidity)
{
mLastEnvSensors[4] = event.values[0];
mLastEnvSensorsSet[4] = true;
RTABMapLib.addEnvSensor(5, event.values[0]);
}
}
@Override
@@ -664,6 +709,9 @@ public class RTABMapActivity extends Activity implements OnClickListener, OnItem
mLocationManager.removeUpdates(mLocationListener);
mSensorManager.unregisterListener(this);
mLastAccelerometerSet = false;
mLastMagnetometerSet= false;
mLastEnvSensorsSet[0] = mLastEnvSensorsSet[1]= mLastEnvSensorsSet[2]= mLastEnvSensorsSet[3]= mLastEnvSensorsSet[4]=false;
RTABMapLib.onPause();
@@ -735,6 +783,29 @@ public class RTABMapActivity extends Activity implements OnClickListener, OnItem
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_UI);
mSensorManager.registerListener(this, mMagnetometer, SensorManager.SENSOR_DELAY_UI);
}
mEnvSensorsSaved = sharedPref.getBoolean(getString(R.string.pref_key_env_sensors_saved), Boolean.parseBoolean(getString(R.string.pref_default_env_sensors_saved)));
if(mEnvSensorsSaved)
{
mSensorManager.registerListener(this, mAmbientTemperature, SensorManager.SENSOR_DELAY_NORMAL);
mSensorManager.registerListener(this, mAmbientAirPressure, SensorManager.SENSOR_DELAY_NORMAL);
mSensorManager.registerListener(this, mAmbientLight, SensorManager.SENSOR_DELAY_NORMAL);
mSensorManager.registerListener(this, mAmbientRelativeHumidity, SensorManager.SENSOR_DELAY_NORMAL);
mEnvSensorsTimer.schedule(new TimerTask() {
@Override
public void run() {
WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
int dbm = 0;
if(wifiInfo != null && (dbm = wifiInfo.getRssi()) > -127)
{
mLastEnvSensors[0] = (float)dbm;
mLastEnvSensorsSet[0] = true;
RTABMapLib.addEnvSensor(1, mLastEnvSensors[0]);
}
}
},0,200);
}
if(!DISABLE_LOG) Log.d(TAG, "set mapping parameters");
RTABMapLib.setOnlineBlending(sharedPref.getBoolean(getString(R.string.pref_key_blending), Boolean.parseBoolean(getString(R.string.pref_default_blending))));
@@ -1233,9 +1304,39 @@ public class RTABMapActivity extends Activity implements OnClickListener, OnItem
statusTexts[3] = getString(R.string.gps)+String.format("[not yet available, %.0fdeg]", mCompassDeg);
}
}
if(mEnvSensorsSaved)
{
statusTexts[4] = getString(R.string.env_sensors);
if(mLastEnvSensorsSet[0])
{
statusTexts[4] += String.format(" %.0f dbm", mLastEnvSensors[0]);
mLastEnvSensorsSet[0] = false;
}
if(mLastEnvSensorsSet[1])
{
statusTexts[4] += String.format(" %.1f %cC", mLastEnvSensors[1], '\u00B0');
mLastEnvSensorsSet[1] = false;
}
if(mLastEnvSensorsSet[2])
{
statusTexts[4] += String.format(" %.1f hPa", mLastEnvSensors[2]);
mLastEnvSensorsSet[2] = false;
}
if(mLastEnvSensorsSet[3])
{
statusTexts[4] += String.format(" %.0f lx", mLastEnvSensors[3]);
mLastEnvSensorsSet[3] = false;
}
if(mLastEnvSensorsSet[4])
{
statusTexts[4] += String.format(" %.0f %%", mLastEnvSensors[4]);
mLastEnvSensorsSet[4] = false;
}
}
String formattedDate = new SimpleDateFormat("HH:mm:ss.SSS").format(new Date());
statusTexts[4] = getString(R.string.time)+formattedDate;
statusTexts[5] = getString(R.string.time)+formattedDate;
int index = STATUS_TEXTS_POSE_INDEX;
statusTexts[index++] = getString(R.string.nodes)+nodes+" (" + nodesDrawn + " shown)";
@@ -1530,6 +1631,8 @@ public class RTABMapActivity extends Activity implements OnClickListener, OnItem
public void stopDisconnectTimer(){
notouchHandler.removeCallbacks(notouchCallback);
Timer timer = new Timer();
timer.cancel();
}
private void updateState(State state)
@@ -99,6 +99,7 @@ public class RTABMapLib
double altitude,
double accuracy,
double bearing);
public static native void addEnvSensor(int type, float value);
public static native void resetMapping();
public static native void save(String outputDatabasePath);
@@ -50,7 +50,7 @@ public class TextManager {
public static final int RI_TEXT_TEXTURE_SIZE = 512; // 512
public static final float RI_TEXT_HEIGHT_BASE = 32.0f;
public static final char RI_TEXT_START = ' ';
public static final char RI_TEXT_STOP = '~'+1;
public static final char RI_TEXT_STOP = '\u00B0'+1;
public float getMaxTextHeight() {return mTextHeight;}