mirror of
https://github.com/introlab/rtabmap.git
synced 2026-10-04 00:57:46 +08:00
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:
+2
-2
@@ -20,8 +20,8 @@ SET(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake_modules")
|
|||||||
# VERSION
|
# VERSION
|
||||||
#######################
|
#######################
|
||||||
SET(RTABMAP_MAJOR_VERSION 0)
|
SET(RTABMAP_MAJOR_VERSION 0)
|
||||||
SET(RTABMAP_MINOR_VERSION 17)
|
SET(RTABMAP_MINOR_VERSION 18)
|
||||||
SET(RTABMAP_PATCH_VERSION 7)
|
SET(RTABMAP_PATCH_VERSION 0)
|
||||||
SET(RTABMAP_VERSION
|
SET(RTABMAP_VERSION
|
||||||
${RTABMAP_MAJOR_VERSION}.${RTABMAP_MINOR_VERSION}.${RTABMAP_PATCH_VERSION})
|
${RTABMAP_MAJOR_VERSION}.${RTABMAP_MINOR_VERSION}.${RTABMAP_PATCH_VERSION})
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
||||||
<uses-feature android:name="android.hardware.location.gps" />
|
<uses-feature android:name="android.hardware.location.gps" />
|
||||||
<uses-feature android:glEsVersion="0x00020000" />
|
<uses-feature android:glEsVersion="0x00020000" />
|
||||||
|
|
||||||
|
|||||||
@@ -438,6 +438,7 @@ void CameraTango::close()
|
|||||||
fisheyeRectifyMapX_ = cv::Mat();
|
fisheyeRectifyMapX_ = cv::Mat();
|
||||||
fisheyeRectifyMapY_ = cv::Mat();
|
fisheyeRectifyMapY_ = cv::Mat();
|
||||||
lastKnownGPS_ = GPS();
|
lastKnownGPS_ = GPS();
|
||||||
|
lastEnvSensors_.clear();
|
||||||
originOffset_ = Transform();
|
originOffset_ = Transform();
|
||||||
originUpdate_ = false;
|
originUpdate_ = false;
|
||||||
}
|
}
|
||||||
@@ -545,6 +546,11 @@ void CameraTango::setGPS(const GPS & gps)
|
|||||||
lastKnownGPS_ = gps;
|
lastKnownGPS_ = gps;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CameraTango::addEnvSensor(int type, float value)
|
||||||
|
{
|
||||||
|
lastEnvSensors_.insert(std::make_pair((EnvSensor::Type)type, EnvSensor((EnvSensor::Type)type, value)));
|
||||||
|
}
|
||||||
|
|
||||||
rtabmap::Transform CameraTango::tangoPoseToTransform(const TangoPoseData * tangoPose) const
|
rtabmap::Transform CameraTango::tangoPoseToTransform(const TangoPoseData * tangoPose) const
|
||||||
{
|
{
|
||||||
UASSERT(tangoPose);
|
UASSERT(tangoPose);
|
||||||
@@ -907,6 +913,12 @@ SensorData CameraTango::captureImage(CameraInfo * info)
|
|||||||
{
|
{
|
||||||
LOGD("GPS too old (current time=%f, gps time = %f)", rgbStamp, lastKnownGPS_.stamp());
|
LOGD("GPS too old (current time=%f, gps time = %f)", rgbStamp, lastKnownGPS_.stamp());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(lastEnvSensors_.size())
|
||||||
|
{
|
||||||
|
data.setEnvSensors(lastEnvSensors_);
|
||||||
|
lastEnvSensors_.clear();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -92,6 +92,7 @@ public:
|
|||||||
void setRawScanPublished(bool enabled) {rawScanPublished_ = enabled;}
|
void setRawScanPublished(bool enabled) {rawScanPublished_ = enabled;}
|
||||||
void setScreenRotation(TangoSupportRotation colorCameraToDisplayRotation) {colorCameraToDisplayRotation_ = colorCameraToDisplayRotation;}
|
void setScreenRotation(TangoSupportRotation colorCameraToDisplayRotation) {colorCameraToDisplayRotation_ = colorCameraToDisplayRotation;}
|
||||||
void setGPS(const GPS & gps);
|
void setGPS(const GPS & gps);
|
||||||
|
void addEnvSensor(int type, float value);
|
||||||
|
|
||||||
void cloudReceived(const cv::Mat & cloud, double timestamp);
|
void cloudReceived(const cv::Mat & cloud, double timestamp);
|
||||||
void rgbReceived(const cv::Mat & tangoImage, int type, double timestamp);
|
void rgbReceived(const cv::Mat & tangoImage, int type, double timestamp);
|
||||||
@@ -130,6 +131,7 @@ private:
|
|||||||
cv::Mat fisheyeRectifyMapX_;
|
cv::Mat fisheyeRectifyMapX_;
|
||||||
cv::Mat fisheyeRectifyMapY_;
|
cv::Mat fisheyeRectifyMapY_;
|
||||||
GPS lastKnownGPS_;
|
GPS lastKnownGPS_;
|
||||||
|
EnvSensors lastEnvSensors_;
|
||||||
Transform originOffset_;
|
Transform originOffset_;
|
||||||
bool originUpdate_;
|
bool originUpdate_;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -2064,6 +2064,14 @@ void RTABMapApp::setGPS(const rtabmap::GPS & gps)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RTABMapApp::addEnvSensor(int type, float value)
|
||||||
|
{
|
||||||
|
if(camera_)
|
||||||
|
{
|
||||||
|
camera_->addEnvSensor(type, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void RTABMapApp::resetMapping()
|
void RTABMapApp::resetMapping()
|
||||||
{
|
{
|
||||||
LOGW("Reset!");
|
LOGW("Reset!");
|
||||||
|
|||||||
@@ -148,6 +148,7 @@ class RTABMapApp : public UEventsHandler {
|
|||||||
void setBackgroundColor(float gray);
|
void setBackgroundColor(float gray);
|
||||||
int setMappingParameter(const std::string & key, const std::string & value);
|
int setMappingParameter(const std::string & key, const std::string & value);
|
||||||
void setGPS(const rtabmap::GPS & gps);
|
void setGPS(const rtabmap::GPS & gps);
|
||||||
|
void addEnvSensor(int type, float value);
|
||||||
|
|
||||||
void resetMapping();
|
void resetMapping();
|
||||||
void save(const std::string & databasePath);
|
void save(const std::string & databasePath);
|
||||||
|
|||||||
@@ -357,6 +357,15 @@ Java_com_introlab_rtabmap_RTABMapLib_setGPS(
|
|||||||
bearing));
|
bearing));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
|
Java_com_introlab_rtabmap_RTABMapLib_addEnvSensor(
|
||||||
|
JNIEnv*, jobject,
|
||||||
|
int type,
|
||||||
|
float value)
|
||||||
|
{
|
||||||
|
return app.addEnvSensor(type, value);
|
||||||
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL
|
JNIEXPORT void JNICALL
|
||||||
Java_com_introlab_rtabmap_RTABMapLib_resetMapping(
|
Java_com_introlab_rtabmap_RTABMapLib_resetMapping(
|
||||||
JNIEnv*, jobject)
|
JNIEnv*, jobject)
|
||||||
|
|||||||
@@ -209,6 +209,11 @@
|
|||||||
android:title="@string/pref_title_gps_saved"
|
android:title="@string/pref_title_gps_saved"
|
||||||
android:summary="@string/pref_summary_gps_saved"
|
android:summary="@string/pref_summary_gps_saved"
|
||||||
android:defaultValue="@string/pref_default_gps_saved"/>
|
android:defaultValue="@string/pref_default_gps_saved"/>
|
||||||
|
<com.introlab.rtabmap.CustomSwitchPreference
|
||||||
|
android:key="@string/pref_key_env_sensors_saved"
|
||||||
|
android:title="@string/pref_title_env_sensors_saved"
|
||||||
|
android:summary="@string/pref_summary_env_sensors_saved"
|
||||||
|
android:defaultValue="@string/pref_default_env_sensors_saved"/>
|
||||||
<com.introlab.rtabmap.CustomSwitchPreference
|
<com.introlab.rtabmap.CustomSwitchPreference
|
||||||
android:key="@string/pref_key_db_in_memory"
|
android:key="@string/pref_key_db_in_memory"
|
||||||
android:title="@string/pref_title_db_in_memory"
|
android:title="@string/pref_title_db_in_memory"
|
||||||
|
|||||||
@@ -36,6 +36,7 @@
|
|||||||
<string name="fps">"FPS (rendering): "</string>
|
<string name="fps">"FPS (rendering): "</string>
|
||||||
<string name="distance">"Distance travelled: "</string>
|
<string name="distance">"Distance travelled: "</string>
|
||||||
<string name="gps">"GPS (long,lat,alt,bearing,err): "</string>
|
<string name="gps">"GPS (long,lat,alt,bearing,err): "</string>
|
||||||
|
<string name="env_sensors">"Sensors: "</string>
|
||||||
<string name="time">"Time: "</string>
|
<string name="time">"Time: "</string>
|
||||||
|
|
||||||
<!-- Preference keys: BEGIN -->
|
<!-- Preference keys: BEGIN -->
|
||||||
@@ -108,6 +109,8 @@
|
|||||||
<string name="pref_default_raw_scan_saved">false</string>
|
<string name="pref_default_raw_scan_saved">false</string>
|
||||||
<string name="pref_key_gps_saved">pref_key_gps_saved</string>
|
<string name="pref_key_gps_saved">pref_key_gps_saved</string>
|
||||||
<string name="pref_default_gps_saved">false</string>
|
<string name="pref_default_gps_saved">false</string>
|
||||||
|
<string name="pref_key_env_sensors_saved">pref_key_env_sensors_saved</string>
|
||||||
|
<string name="pref_default_env_sensors_saved">false</string>
|
||||||
<string name="pref_key_db_in_memory">pref_key_db_in_memory</string>
|
<string name="pref_key_db_in_memory">pref_key_db_in_memory</string>
|
||||||
<string name="pref_default_db_in_memory">false</string>
|
<string name="pref_default_db_in_memory">false</string>
|
||||||
|
|
||||||
@@ -349,7 +352,9 @@
|
|||||||
<string name="pref_title_raw_scan_saved">Save Raw Scan</string>
|
<string name="pref_title_raw_scan_saved">Save Raw Scan</string>
|
||||||
<string name="pref_summary_raw_scan_saved">Save raw point clouds in database.</string>
|
<string name="pref_summary_raw_scan_saved">Save raw point clouds in database.</string>
|
||||||
<string name="pref_title_gps_saved">Save GPS</string>
|
<string name="pref_title_gps_saved">Save GPS</string>
|
||||||
<string name="pref_summary_gps_saved">Save GPS in database.</string>
|
<string name="pref_summary_gps_saved">Save GPS to database.</string>
|
||||||
|
<string name="pref_title_env_sensors_saved">Save Environmental Sensors</string>
|
||||||
|
<string name="pref_summary_env_sensors_saved">Save Wifi strength, temperature, air pressure, light intensity and relative humidity to database.</string>
|
||||||
<string name="pref_title_db_in_memory">Database In Memory</string>
|
<string name="pref_title_db_in_memory">Database In Memory</string>
|
||||||
<string name="pref_summary_db_in_memory">The database is kept in RAM for fast access. Set to false to reduce RAM used at the cost of slower access. This parameter is applied on reset or when a database is opened.</string>
|
<string name="pref_summary_db_in_memory">The database is kept in RAM for fast access. Set to false to reduce RAM used at the cost of slower access. This parameter is applied on reset or when a database is opened.</string>
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,8 @@ import java.util.ArrayList;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.Timer;
|
||||||
|
import java.util.TimerTask;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.ActivityManager;
|
import android.app.ActivityManager;
|
||||||
@@ -45,6 +47,8 @@ import android.location.Location;
|
|||||||
import android.location.LocationListener;
|
import android.location.LocationListener;
|
||||||
import android.location.LocationManager;
|
import android.location.LocationManager;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
import android.net.wifi.WifiInfo;
|
||||||
|
import android.net.wifi.WifiManager;
|
||||||
import android.opengl.GLSurfaceView;
|
import android.opengl.GLSurfaceView;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Environment;
|
import android.os.Environment;
|
||||||
@@ -192,14 +196,23 @@ public class RTABMapActivity extends Activity implements OnClickListener, OnItem
|
|||||||
private String mMinInliers;
|
private String mMinInliers;
|
||||||
private String mMaxOptimizationError;
|
private String mMaxOptimizationError;
|
||||||
private boolean mGPSSaved = false;
|
private boolean mGPSSaved = false;
|
||||||
|
private boolean mEnvSensorsSaved = false;
|
||||||
|
|
||||||
private LocationManager mLocationManager;
|
private LocationManager mLocationManager;
|
||||||
private LocationListener mLocationListener;
|
private LocationListener mLocationListener;
|
||||||
private Location mLastKnownLocation;
|
private Location mLastKnownLocation;
|
||||||
private SensorManager mSensorManager;
|
private SensorManager mSensorManager;
|
||||||
|
private WifiManager mWifiManager;
|
||||||
|
private Timer mEnvSensorsTimer = new Timer();
|
||||||
Sensor mAccelerometer;
|
Sensor mAccelerometer;
|
||||||
Sensor mMagnetometer;
|
Sensor mMagnetometer;
|
||||||
|
Sensor mAmbientTemperature;
|
||||||
|
Sensor mAmbientLight;
|
||||||
|
Sensor mAmbientAirPressure;
|
||||||
|
Sensor mAmbientRelativeHumidity;
|
||||||
private float mCompassDeg = 0.0f;
|
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[] mLastAccelerometer = new float[3];
|
||||||
private float[] mLastMagnetometer = 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 AlertDialog mMemoryWarningDialog = null;
|
||||||
|
|
||||||
private final int STATUS_TEXTS_SIZE = 19;
|
private final int STATUS_TEXTS_SIZE = 20;
|
||||||
private final int STATUS_TEXTS_POSE_INDEX = 5;
|
private final int STATUS_TEXTS_POSE_INDEX = 6;
|
||||||
private String[] mStatusTexts = new String[STATUS_TEXTS_SIZE];
|
private String[] mStatusTexts = new String[STATUS_TEXTS_SIZE];
|
||||||
|
|
||||||
GestureDetector mGesDetect = null;
|
GestureDetector mGesDetect = null;
|
||||||
@@ -517,8 +530,13 @@ public class RTABMapActivity extends Activity implements OnClickListener, OnItem
|
|||||||
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
|
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
|
||||||
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
|
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
|
||||||
mMagnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
|
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};
|
float [] values = {1,0,0,0,0,1,0,-1,0};
|
||||||
mDeviceToCamera.setValues(values);
|
mDeviceToCamera.setValues(values);
|
||||||
|
mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
|
||||||
|
|
||||||
setCamera(1);
|
setCamera(1);
|
||||||
|
|
||||||
@@ -527,25 +545,52 @@ public class RTABMapActivity extends Activity implements OnClickListener, OnItem
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onSensorChanged(SensorEvent event) {
|
public void onSensorChanged(SensorEvent event) {
|
||||||
if (event.sensor == mAccelerometer) {
|
if(event.sensor == mAccelerometer || event.sensor == mMagnetometer)
|
||||||
System.arraycopy(event.values, 0, mLastAccelerometer, 0, event.values.length);
|
{
|
||||||
mLastAccelerometerSet = true;
|
if (event.sensor == mAccelerometer) {
|
||||||
} else if (event.sensor == mMagnetometer) {
|
System.arraycopy(event.values, 0, mLastAccelerometer, 0, event.values.length);
|
||||||
System.arraycopy(event.values, 0, mLastMagnetometer, 0, event.values.length);
|
mLastAccelerometerSet = true;
|
||||||
mLastMagnetometerSet = true;
|
} else if (event.sensor == mMagnetometer) {
|
||||||
}
|
System.arraycopy(event.values, 0, mLastMagnetometer, 0, event.values.length);
|
||||||
if (mLastAccelerometerSet && mLastMagnetometerSet) {
|
mLastMagnetometerSet = true;
|
||||||
SensorManager.getRotationMatrix(mR, null, mLastAccelerometer, mLastMagnetometer);
|
}
|
||||||
mRMat.setValues(mR);
|
if (mLastAccelerometerSet && mLastMagnetometerSet) {
|
||||||
mNewR.setConcat(mRMat, mDeviceToCamera) ;
|
SensorManager.getRotationMatrix(mR, null, mLastAccelerometer, mLastMagnetometer);
|
||||||
mNewR.getValues(mR);
|
mRMat.setValues(mR);
|
||||||
SensorManager.getOrientation(mR, mOrientation);
|
mNewR.setConcat(mRMat, mDeviceToCamera) ;
|
||||||
mCompassDeg = mOrientation[0] * 180.0f/(float)Math.PI;
|
mNewR.getValues(mR);
|
||||||
if(mCompassDeg<0.0f)
|
SensorManager.getOrientation(mR, mOrientation);
|
||||||
{
|
mCompassDeg = mOrientation[0] * 180.0f/(float)Math.PI;
|
||||||
mCompassDeg += 360.0f;
|
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
|
@Override
|
||||||
@@ -664,6 +709,9 @@ public class RTABMapActivity extends Activity implements OnClickListener, OnItem
|
|||||||
|
|
||||||
mLocationManager.removeUpdates(mLocationListener);
|
mLocationManager.removeUpdates(mLocationListener);
|
||||||
mSensorManager.unregisterListener(this);
|
mSensorManager.unregisterListener(this);
|
||||||
|
mLastAccelerometerSet = false;
|
||||||
|
mLastMagnetometerSet= false;
|
||||||
|
mLastEnvSensorsSet[0] = mLastEnvSensorsSet[1]= mLastEnvSensorsSet[2]= mLastEnvSensorsSet[3]= mLastEnvSensorsSet[4]=false;
|
||||||
|
|
||||||
RTABMapLib.onPause();
|
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, mAccelerometer, SensorManager.SENSOR_DELAY_UI);
|
||||||
mSensorManager.registerListener(this, mMagnetometer, 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");
|
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))));
|
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);
|
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());
|
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;
|
int index = STATUS_TEXTS_POSE_INDEX;
|
||||||
statusTexts[index++] = getString(R.string.nodes)+nodes+" (" + nodesDrawn + " shown)";
|
statusTexts[index++] = getString(R.string.nodes)+nodes+" (" + nodesDrawn + " shown)";
|
||||||
@@ -1530,6 +1631,8 @@ public class RTABMapActivity extends Activity implements OnClickListener, OnItem
|
|||||||
|
|
||||||
public void stopDisconnectTimer(){
|
public void stopDisconnectTimer(){
|
||||||
notouchHandler.removeCallbacks(notouchCallback);
|
notouchHandler.removeCallbacks(notouchCallback);
|
||||||
|
Timer timer = new Timer();
|
||||||
|
timer.cancel();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateState(State state)
|
private void updateState(State state)
|
||||||
|
|||||||
@@ -99,6 +99,7 @@ public class RTABMapLib
|
|||||||
double altitude,
|
double altitude,
|
||||||
double accuracy,
|
double accuracy,
|
||||||
double bearing);
|
double bearing);
|
||||||
|
public static native void addEnvSensor(int type, float value);
|
||||||
|
|
||||||
public static native void resetMapping();
|
public static native void resetMapping();
|
||||||
public static native void save(String outputDatabasePath);
|
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 int RI_TEXT_TEXTURE_SIZE = 512; // 512
|
||||||
public static final float RI_TEXT_HEIGHT_BASE = 32.0f;
|
public static final float RI_TEXT_HEIGHT_BASE = 32.0f;
|
||||||
public static final char RI_TEXT_START = ' ';
|
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;}
|
public float getMaxTextHeight() {return mTextHeight;}
|
||||||
|
|
||||||
|
|||||||
@@ -115,6 +115,9 @@ public:
|
|||||||
|
|
||||||
bool load(const std::string & directory, const std::string & cameraName);
|
bool load(const std::string & directory, const std::string & cameraName);
|
||||||
bool save(const std::string & directory) const;
|
bool save(const std::string & directory) const;
|
||||||
|
std::vector<unsigned char> serialize() const;
|
||||||
|
unsigned int deserialize(const std::vector<unsigned char>& data);
|
||||||
|
unsigned int deserialize(const unsigned char * data, unsigned int dataSize);
|
||||||
|
|
||||||
CameraModel scaled(double scale) const;
|
CameraModel scaled(double scale) const;
|
||||||
CameraModel roi(const cv::Rect & roi) const;
|
CameraModel roi(const cv::Rect & roi) const;
|
||||||
|
|||||||
@@ -165,8 +165,9 @@ public:
|
|||||||
void getNodeData(int signatureId, SensorData & data, bool images = true, bool scan = true, bool userData = true, bool occupancyGrid = true) const;
|
void getNodeData(int signatureId, SensorData & data, bool images = true, bool scan = true, bool userData = true, bool occupancyGrid = true) const;
|
||||||
bool getCalibration(int signatureId, std::vector<CameraModel> & models, StereoCameraModel & stereoModel) const;
|
bool getCalibration(int signatureId, std::vector<CameraModel> & models, StereoCameraModel & stereoModel) const;
|
||||||
bool getLaserScanInfo(int signatureId, LaserScan & info) const;
|
bool getLaserScanInfo(int signatureId, LaserScan & info) const;
|
||||||
bool getNodeInfo(int signatureId, Transform & pose, int & mapId, int & weight, std::string & label, double & stamp, Transform & groundTruthPose, std::vector<float> & velocity, GPS & gps) const;
|
bool getNodeInfo(int signatureId, Transform & pose, int & mapId, int & weight, std::string & label, double & stamp, Transform & groundTruthPose, std::vector<float> & velocity, GPS & gps, EnvSensors & sensors) const;
|
||||||
void loadLinks(int signatureId, std::map<int, Link> & links, Link::Type type = Link::kUndef) const;
|
void loadLinks(int signatureId, std::map<int, Link> & links, Link::Type type = Link::kUndef) const;
|
||||||
|
void loadTags(int signatureId, std::map<int, TransformStamped> & tags) const;
|
||||||
void getWeight(int signatureId, int & weight) const;
|
void getWeight(int signatureId, int & weight) const;
|
||||||
void getAllNodeIds(std::set<int> & ids, bool ignoreChildren = false, bool ignoreBadSignatures = false) const;
|
void getAllNodeIds(std::set<int> & ids, bool ignoreChildren = false, bool ignoreBadSignatures = false) const;
|
||||||
void getAllLinks(std::multimap<int, Link> & links, bool ignoreNullLinks = true) const;
|
void getAllLinks(std::multimap<int, Link> & links, bool ignoreNullLinks = true) const;
|
||||||
@@ -259,11 +260,12 @@ protected:
|
|||||||
virtual void loadSignaturesQuery(const std::list<int> & ids, std::list<Signature *> & signatures) const = 0;
|
virtual void loadSignaturesQuery(const std::list<int> & ids, std::list<Signature *> & signatures) const = 0;
|
||||||
virtual void loadWordsQuery(const std::set<int> & wordIds, std::list<VisualWord *> & vws) const = 0;
|
virtual void loadWordsQuery(const std::set<int> & wordIds, std::list<VisualWord *> & vws) const = 0;
|
||||||
virtual void loadLinksQuery(int signatureId, std::map<int, Link> & links, Link::Type type = Link::kUndef) const = 0;
|
virtual void loadLinksQuery(int signatureId, std::map<int, Link> & links, Link::Type type = Link::kUndef) const = 0;
|
||||||
|
virtual void loadTagsQuery(int signatureId, std::map<int, TransformStamped> & tags) const = 0;
|
||||||
|
|
||||||
virtual void loadNodeDataQuery(std::list<Signature *> & signatures, bool images=true, bool scan=true, bool userData=true, bool occupancyGrid=true) const = 0;
|
virtual void loadNodeDataQuery(std::list<Signature *> & signatures, bool images=true, bool scan=true, bool userData=true, bool occupancyGrid=true) const = 0;
|
||||||
virtual bool getCalibrationQuery(int signatureId, std::vector<CameraModel> & models, StereoCameraModel & stereoModel) const = 0;
|
virtual bool getCalibrationQuery(int signatureId, std::vector<CameraModel> & models, StereoCameraModel & stereoModel) const = 0;
|
||||||
virtual bool getLaserScanInfoQuery(int signatureId, LaserScan & info) const = 0;
|
virtual bool getLaserScanInfoQuery(int signatureId, LaserScan & info) const = 0;
|
||||||
virtual bool getNodeInfoQuery(int signatureId, Transform & pose, int & mapId, int & weight, std::string & label, double & stamp, Transform & groundTruthPose, std::vector<float> & velocity, GPS & gps) const = 0;
|
virtual bool getNodeInfoQuery(int signatureId, Transform & pose, int & mapId, int & weight, std::string & label, double & stamp, Transform & groundTruthPose, std::vector<float> & velocity, GPS & gps, EnvSensors & sensors) const = 0;
|
||||||
virtual void getAllNodeIdsQuery(std::set<int> & ids, bool ignoreChildren, bool ignoreBadSignatures) const = 0;
|
virtual void getAllNodeIdsQuery(std::set<int> & ids, bool ignoreChildren, bool ignoreBadSignatures) const = 0;
|
||||||
virtual void getAllLinksQuery(std::multimap<int, Link> & links, bool ignoreNullLinks) const = 0;
|
virtual void getAllLinksQuery(std::multimap<int, Link> & links, bool ignoreNullLinks) const = 0;
|
||||||
virtual void getLastIdQuery(const std::string & tableName, int & id) const = 0;
|
virtual void getLastIdQuery(const std::string & tableName, int & id) const = 0;
|
||||||
|
|||||||
@@ -131,11 +131,12 @@ protected:
|
|||||||
virtual void loadSignaturesQuery(const std::list<int> & ids, std::list<Signature *> & signatures) const;
|
virtual void loadSignaturesQuery(const std::list<int> & ids, std::list<Signature *> & signatures) const;
|
||||||
virtual void loadWordsQuery(const std::set<int> & wordIds, std::list<VisualWord *> & vws) const;
|
virtual void loadWordsQuery(const std::set<int> & wordIds, std::list<VisualWord *> & vws) const;
|
||||||
virtual void loadLinksQuery(int signatureId, std::map<int, Link> & links, Link::Type type = Link::kUndef) const;
|
virtual void loadLinksQuery(int signatureId, std::map<int, Link> & links, Link::Type type = Link::kUndef) const;
|
||||||
|
virtual void loadTagsQuery(int signatureId, std::map<int, TransformStamped> & tags) const;
|
||||||
|
|
||||||
virtual void loadNodeDataQuery(std::list<Signature *> & signatures, bool images=true, bool scan=true, bool userData=true, bool occupancyGrid=true) const;
|
virtual void loadNodeDataQuery(std::list<Signature *> & signatures, bool images=true, bool scan=true, bool userData=true, bool occupancyGrid=true) const;
|
||||||
virtual bool getCalibrationQuery(int signatureId, std::vector<CameraModel> & models, StereoCameraModel & stereoModel) const;
|
virtual bool getCalibrationQuery(int signatureId, std::vector<CameraModel> & models, StereoCameraModel & stereoModel) const;
|
||||||
virtual bool getLaserScanInfoQuery(int signatureId, LaserScan & info) const;
|
virtual bool getLaserScanInfoQuery(int signatureId, LaserScan & info) const;
|
||||||
virtual bool getNodeInfoQuery(int signatureId, Transform & pose, int & mapId, int & weight, std::string & label, double & stamp, Transform & groundTruthPose, std::vector<float> & velocity, GPS & gps) const;
|
virtual bool getNodeInfoQuery(int signatureId, Transform & pose, int & mapId, int & weight, std::string & label, double & stamp, Transform & groundTruthPose, std::vector<float> & velocity, GPS & gps, EnvSensors & sensors) const;
|
||||||
virtual void getAllNodeIdsQuery(std::set<int> & ids, bool ignoreChildren, bool ignoreBadSignatures) const;
|
virtual void getAllNodeIdsQuery(std::set<int> & ids, bool ignoreChildren, bool ignoreBadSignatures) const;
|
||||||
virtual void getAllLinksQuery(std::multimap<int, Link> & links, bool ignoreNullLinks) const;
|
virtual void getAllLinksQuery(std::multimap<int, Link> & links, bool ignoreNullLinks) const;
|
||||||
virtual void getLastIdQuery(const std::string & tableName, int & id) const;
|
virtual void getLastIdQuery(const std::string & tableName, int & id) const;
|
||||||
@@ -151,18 +152,17 @@ private:
|
|||||||
std::string queryStepSensorData() const;
|
std::string queryStepSensorData() const;
|
||||||
std::string queryStepLinkUpdate() const;
|
std::string queryStepLinkUpdate() const;
|
||||||
std::string queryStepLink() const;
|
std::string queryStepLink() const;
|
||||||
|
std::string queryStepTag() const;
|
||||||
std::string queryStepWordsChanged() const;
|
std::string queryStepWordsChanged() const;
|
||||||
std::string queryStepKeypoint() const;
|
std::string queryStepKeypoint() const;
|
||||||
std::string queryStepOccupancyGridUpdate() const;
|
std::string queryStepOccupancyGridUpdate() const;
|
||||||
void stepNode(sqlite3_stmt * ppStmt, const Signature * s) const;
|
void stepNode(sqlite3_stmt * ppStmt, const Signature * s) const;
|
||||||
void stepImage(
|
void stepImage(sqlite3_stmt * ppStmt, int id, const cv::Mat & imageBytes) const;
|
||||||
sqlite3_stmt * ppStmt,
|
|
||||||
int id,
|
|
||||||
const cv::Mat & imageBytes) const;
|
|
||||||
void stepDepth(sqlite3_stmt * ppStmt, const SensorData & sensorData) const;
|
void stepDepth(sqlite3_stmt * ppStmt, const SensorData & sensorData) const;
|
||||||
void stepDepthUpdate(sqlite3_stmt * ppStmt, int nodeId, const cv::Mat & imageCompressed) const;
|
void stepDepthUpdate(sqlite3_stmt * ppStmt, int nodeId, const cv::Mat & imageCompressed) const;
|
||||||
void stepSensorData(sqlite3_stmt * ppStmt, const SensorData & sensorData) const;
|
void stepSensorData(sqlite3_stmt * ppStmt, const SensorData & sensorData) const;
|
||||||
void stepLink(sqlite3_stmt * ppStmt, const Link & link) const;
|
void stepLink(sqlite3_stmt * ppStmt, const Link & link) const;
|
||||||
|
void stepTag(sqlite3_stmt * ppStmt, int nodeId, int tagId, const TransformStamped & pose) const;
|
||||||
void stepWordsChanged(sqlite3_stmt * ppStmt, int signatureId, int oldWordId, int newWordId) const;
|
void stepWordsChanged(sqlite3_stmt * ppStmt, int signatureId, int oldWordId, int newWordId) const;
|
||||||
void stepKeypoint(sqlite3_stmt * ppStmt, int signatureId, int wordId, const cv::KeyPoint & kp, const cv::Point3f & pt, const cv::Mat & descriptor) const;
|
void stepKeypoint(sqlite3_stmt * ppStmt, int signatureId, int wordId, const cv::KeyPoint & kp, const cv::Point3f & pt, const cv::Mat & descriptor) const;
|
||||||
void stepOccupancyGridUpdate(sqlite3_stmt * ppStmt,
|
void stepOccupancyGridUpdate(sqlite3_stmt * ppStmt,
|
||||||
@@ -175,6 +175,7 @@ private:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void loadLinksQuery(std::list<Signature *> & signatures) const;
|
void loadLinksQuery(std::list<Signature *> & signatures) const;
|
||||||
|
void loadTagsQuery(std::list<Signature *> & signatures) const;
|
||||||
int loadOrSaveDb(sqlite3 *pInMemory, const std::string & fileName, int isSave) const;
|
int loadOrSaveDb(sqlite3 *pInMemory, const std::string & fileName, int isSave) const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|||||||
@@ -0,0 +1,85 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2010-2018, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
* Neither the name of the Universite de Sherbrooke nor the
|
||||||
|
names of its contributors may be used to endorse or promote products
|
||||||
|
derived from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
|
||||||
|
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CORELIB_INCLUDE_RTABMAP_CORE_ENVSENSOR_H_
|
||||||
|
#define CORELIB_INCLUDE_RTABMAP_CORE_ENVSENSOR_H_
|
||||||
|
|
||||||
|
namespace rtabmap {
|
||||||
|
|
||||||
|
class EnvSensor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum Type {
|
||||||
|
// built-in types
|
||||||
|
kUndefined = 0,
|
||||||
|
kWifiSignalStrength, // dBm
|
||||||
|
kAmbientTemperature, // Celcius
|
||||||
|
kAmbientAirPressure, // hPa
|
||||||
|
kAmbientLight, // lx
|
||||||
|
kAmbientRelativeHumidity, // %
|
||||||
|
|
||||||
|
// user types
|
||||||
|
kCustomSensor1 = 100,
|
||||||
|
kCustomSensor2,
|
||||||
|
kCustomSensor3,
|
||||||
|
kCustomSensor4,
|
||||||
|
kCustomSensor5,
|
||||||
|
kCustomSensor6,
|
||||||
|
kCustomSensor7,
|
||||||
|
kCustomSensor8,
|
||||||
|
kCustomSensor9
|
||||||
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
EnvSensor() :
|
||||||
|
type_(kUndefined),
|
||||||
|
value_(0.0),
|
||||||
|
stamp_(0.0)
|
||||||
|
{}
|
||||||
|
EnvSensor(const Type & type, const double & value,const double & stamp = 0) :
|
||||||
|
type_(type),
|
||||||
|
value_(value),
|
||||||
|
stamp_(stamp)
|
||||||
|
{}
|
||||||
|
|
||||||
|
virtual ~EnvSensor() {}
|
||||||
|
|
||||||
|
const Type & type() const {return type_;}
|
||||||
|
const double & value() const {return value_;}
|
||||||
|
const double & stamp() const {return stamp_;}
|
||||||
|
|
||||||
|
private:
|
||||||
|
Type type_;
|
||||||
|
double value_;
|
||||||
|
double stamp_;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef std::map<EnvSensor::Type, EnvSensor> EnvSensors;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CORELIB_INCLUDE_RTABMAP_CORE_ENVSENSOR_H_ */
|
||||||
@@ -0,0 +1,78 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2010-2018, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
* Neither the name of the Universite de Sherbrooke nor the
|
||||||
|
names of its contributors may be used to endorse or promote products
|
||||||
|
derived from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
|
||||||
|
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CORELIB_INCLUDE_RTABMAP_CORE_GPS_H_
|
||||||
|
#define CORELIB_INCLUDE_RTABMAP_CORE_GPS_H_
|
||||||
|
|
||||||
|
#include <rtabmap/core/GeodeticCoords.h>
|
||||||
|
|
||||||
|
namespace rtabmap {
|
||||||
|
|
||||||
|
class GPS
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
GPS():
|
||||||
|
stamp_(0.0),
|
||||||
|
longitude_(0.0),
|
||||||
|
latitude_(0.0),
|
||||||
|
altitude_(0.0),
|
||||||
|
error_(0.0),
|
||||||
|
bearing_(0.0)
|
||||||
|
{}
|
||||||
|
GPS(const double & stamp,
|
||||||
|
const double & longitude,
|
||||||
|
const double & latitude,
|
||||||
|
const double & altitude,
|
||||||
|
const double & error,
|
||||||
|
const double & bearing):
|
||||||
|
stamp_(stamp),
|
||||||
|
longitude_(longitude),
|
||||||
|
latitude_(latitude),
|
||||||
|
altitude_(altitude),
|
||||||
|
error_(error),
|
||||||
|
bearing_(bearing)
|
||||||
|
{}
|
||||||
|
const double & stamp() const {return stamp_;}
|
||||||
|
const double & longitude() const {return longitude_;}
|
||||||
|
const double & latitude() const {return latitude_;}
|
||||||
|
const double & altitude() const {return altitude_;}
|
||||||
|
const double & error() const {return error_;}
|
||||||
|
const double & bearing() const {return bearing_;}
|
||||||
|
|
||||||
|
GeodeticCoords toGeodeticCoords() const {return GeodeticCoords(latitude_, longitude_, altitude_);}
|
||||||
|
private:
|
||||||
|
double stamp_; // in sec
|
||||||
|
double longitude_; // DD
|
||||||
|
double latitude_; // DD
|
||||||
|
double altitude_; // m
|
||||||
|
double error_; // m
|
||||||
|
double bearing_; // deg (North 0->360 clockwise)
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CORELIB_INCLUDE_RTABMAP_CORE_GPS_H_ */
|
||||||
@@ -81,47 +81,6 @@ private:
|
|||||||
double altitude_; // m
|
double altitude_; // m
|
||||||
};
|
};
|
||||||
|
|
||||||
class GPS
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
GPS():
|
|
||||||
stamp_(0.0),
|
|
||||||
longitude_(0.0),
|
|
||||||
latitude_(0.0),
|
|
||||||
altitude_(0.0),
|
|
||||||
error_(0.0),
|
|
||||||
bearing_(0.0)
|
|
||||||
{}
|
|
||||||
GPS(const double & stamp,
|
|
||||||
const double & longitude,
|
|
||||||
const double & latitude,
|
|
||||||
const double & altitude,
|
|
||||||
const double & error,
|
|
||||||
const double & bearing):
|
|
||||||
stamp_(stamp),
|
|
||||||
longitude_(longitude),
|
|
||||||
latitude_(latitude),
|
|
||||||
altitude_(altitude),
|
|
||||||
error_(error),
|
|
||||||
bearing_(bearing)
|
|
||||||
{}
|
|
||||||
const double & stamp() const {return stamp_;}
|
|
||||||
const double & longitude() const {return longitude_;}
|
|
||||||
const double & latitude() const {return latitude_;}
|
|
||||||
const double & altitude() const {return altitude_;}
|
|
||||||
const double & error() const {return error_;}
|
|
||||||
const double & bearing() const {return bearing_;}
|
|
||||||
|
|
||||||
GeodeticCoords toGeodeticCoords() const {return GeodeticCoords(latitude_, longitude_, altitude_);}
|
|
||||||
private:
|
|
||||||
double stamp_; // in sec
|
|
||||||
double longitude_; // DD
|
|
||||||
double latitude_; // DD
|
|
||||||
double altitude_; // m
|
|
||||||
double error_; // m
|
|
||||||
double bearing_; // deg (North 0->360 clockwise)
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* GEODETICCOORDS_H_ */
|
#endif /* GEODETICCOORDS_H_ */
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include <list>
|
#include <list>
|
||||||
#include <rtabmap/core/Parameters.h>
|
#include <rtabmap/core/Parameters.h>
|
||||||
#include <rtabmap/core/Link.h>
|
#include <rtabmap/core/Link.h>
|
||||||
#include <rtabmap/core/GeodeticCoords.h>
|
#include <rtabmap/core/GPS.h>
|
||||||
|
|
||||||
namespace rtabmap {
|
namespace rtabmap {
|
||||||
class Memory;
|
class Memory;
|
||||||
|
|||||||
@@ -54,16 +54,44 @@ public:
|
|||||||
static bool isScanHasNormals(const Format & format);
|
static bool isScanHasNormals(const Format & format);
|
||||||
static bool isScanHasRGB(const Format & format);
|
static bool isScanHasRGB(const Format & format);
|
||||||
static bool isScanHasIntensity(const Format & format);
|
static bool isScanHasIntensity(const Format & format);
|
||||||
static LaserScan backwardCompatibility(const cv::Mat & oldScanFormat, int maxPoints = 0, int maxRange = 0, const Transform & localTransform = Transform::getIdentity());
|
static LaserScan backwardCompatibility(
|
||||||
|
const cv::Mat & oldScanFormat,
|
||||||
|
int maxPoints = 0,
|
||||||
|
int maxRange = 0,
|
||||||
|
const Transform & localTransform = Transform::getIdentity());
|
||||||
|
static LaserScan backwardCompatibility(
|
||||||
|
const cv::Mat & oldScanFormat,
|
||||||
|
float minRange,
|
||||||
|
float maxRange,
|
||||||
|
float angleMin,
|
||||||
|
float angleMax,
|
||||||
|
float angleInc,
|
||||||
|
const Transform & localTransform = Transform::getIdentity());
|
||||||
|
|
||||||
public:
|
public:
|
||||||
LaserScan();
|
LaserScan();
|
||||||
LaserScan(const cv::Mat & data, int maxPoints, float maxRange, Format format, const Transform & localTransform = Transform::getIdentity());
|
LaserScan(const cv::Mat & data,
|
||||||
|
int maxPoints,
|
||||||
|
float maxRange,
|
||||||
|
Format format,
|
||||||
|
const Transform & localTransform = Transform::getIdentity());
|
||||||
|
LaserScan(const cv::Mat & data,
|
||||||
|
Format format,
|
||||||
|
float minRange,
|
||||||
|
float maxRange,
|
||||||
|
float angleMin,
|
||||||
|
float angleMax,
|
||||||
|
float angleIncrement,
|
||||||
|
const Transform & localTransform = Transform::getIdentity());
|
||||||
|
|
||||||
const cv::Mat & data() const {return data_;}
|
const cv::Mat & data() const {return data_;}
|
||||||
int maxPoints() const {return maxPoints_;}
|
|
||||||
float maxRange() const {return maxRange_;}
|
|
||||||
Format format() const {return format_;}
|
Format format() const {return format_;}
|
||||||
|
int maxPoints() const {return maxPoints_;}
|
||||||
|
float rangeMin() const {return rangeMin_;}
|
||||||
|
float rangeMax() const {return rangeMax_;}
|
||||||
|
float angleMin() const {return angleMin_;}
|
||||||
|
float angleMax() const {return angleMax_;}
|
||||||
|
float angleIncrement() const {return angleIncrement_;}
|
||||||
Transform localTransform() const {return localTransform_;}
|
Transform localTransform() const {return localTransform_;}
|
||||||
|
|
||||||
bool isEmpty() const {return data_.empty();}
|
bool isEmpty() const {return data_.empty();}
|
||||||
@@ -74,7 +102,7 @@ public:
|
|||||||
bool hasRGB() const {return isScanHasRGB(format_);}
|
bool hasRGB() const {return isScanHasRGB(format_);}
|
||||||
bool hasIntensity() const {return isScanHasIntensity(format_);}
|
bool hasIntensity() const {return isScanHasIntensity(format_);}
|
||||||
bool isCompressed() const {return !data_.empty() && data_.type()==CV_8UC1;}
|
bool isCompressed() const {return !data_.empty() && data_.type()==CV_8UC1;}
|
||||||
LaserScan clone() const {return LaserScan(data_.clone(), maxPoints_, maxRange_, format_, localTransform_.clone());}
|
LaserScan clone() const;
|
||||||
|
|
||||||
int getIntensityOffset() const {return hasIntensity()?(is2d()?2:3):-1;}
|
int getIntensityOffset() const {return hasIntensity()?(is2d()?2:3):-1;}
|
||||||
int getRGBOffset() const {return hasRGB()?(is2d()?2:3):-1;}
|
int getRGBOffset() const {return hasRGB()?(is2d()?2:3):-1;}
|
||||||
@@ -84,9 +112,13 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
cv::Mat data_;
|
cv::Mat data_;
|
||||||
int maxPoints_;
|
|
||||||
float maxRange_;
|
|
||||||
Format format_;
|
Format format_;
|
||||||
|
int maxPoints_;
|
||||||
|
float rangeMin_;
|
||||||
|
float rangeMax_;
|
||||||
|
float angleMin_;
|
||||||
|
float angleMax_;
|
||||||
|
float angleIncrement_;
|
||||||
Transform localTransform_;
|
Transform localTransform_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -186,6 +186,7 @@ public:
|
|||||||
Transform & groundTruth,
|
Transform & groundTruth,
|
||||||
std::vector<float> & velocity,
|
std::vector<float> & velocity,
|
||||||
GPS & gps,
|
GPS & gps,
|
||||||
|
EnvSensors & sensors,
|
||||||
bool lookInDatabase = false) const;
|
bool lookInDatabase = false) const;
|
||||||
cv::Mat getImageCompressed(int signatureId) const;
|
cv::Mat getImageCompressed(int signatureId) const;
|
||||||
SensorData getNodeData(int nodeId, bool uncompressedData = false) const;
|
SensorData getNodeData(int nodeId, bool uncompressedData = false) const;
|
||||||
|
|||||||
@@ -33,11 +33,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include <rtabmap/core/CameraModel.h>
|
#include <rtabmap/core/CameraModel.h>
|
||||||
#include <rtabmap/core/StereoCameraModel.h>
|
#include <rtabmap/core/StereoCameraModel.h>
|
||||||
#include <rtabmap/core/Transform.h>
|
#include <rtabmap/core/Transform.h>
|
||||||
#include <rtabmap/core/GeodeticCoords.h>
|
|
||||||
#include <opencv2/core/core.hpp>
|
#include <opencv2/core/core.hpp>
|
||||||
#include <opencv2/features2d/features2d.hpp>
|
#include <opencv2/features2d/features2d.hpp>
|
||||||
#include <rtabmap/core/LaserScan.h>
|
#include <rtabmap/core/LaserScan.h>
|
||||||
#include <rtabmap/core/IMU.h>
|
#include <rtabmap/core/IMU.h>
|
||||||
|
#include <rtabmap/core/GPS.h>
|
||||||
|
#include <rtabmap/core/EnvSensor.h>
|
||||||
|
|
||||||
namespace rtabmap
|
namespace rtabmap
|
||||||
{
|
{
|
||||||
@@ -235,18 +236,16 @@ public:
|
|||||||
const Transform & globalPose() const {return globalPose_;}
|
const Transform & globalPose() const {return globalPose_;}
|
||||||
const cv::Mat & globalPoseCovariance() const {return globalPoseCovariance_;}
|
const cv::Mat & globalPoseCovariance() const {return globalPoseCovariance_;}
|
||||||
|
|
||||||
void setGPS(const GPS & gps)
|
void setGPS(const GPS & gps) {gps_ = gps;}
|
||||||
{
|
|
||||||
gps_ = gps;
|
|
||||||
}
|
|
||||||
const GPS & gps() const {return gps_;}
|
const GPS & gps() const {return gps_;}
|
||||||
|
|
||||||
void setIMU(const IMU & imu)
|
void setIMU(const IMU & imu) {imu_ = imu; }
|
||||||
{
|
|
||||||
imu_ = imu;
|
|
||||||
}
|
|
||||||
const IMU & imu() const {return imu_;}
|
const IMU & imu() const {return imu_;}
|
||||||
|
|
||||||
|
void setEnvSensors(const EnvSensors & sensors) {_envSensors = sensors;}
|
||||||
|
void addEnvSensor(const EnvSensor & sensor) {_envSensors.insert(std::make_pair(sensor.type(), sensor));}
|
||||||
|
const EnvSensors & envSensors() const {return _envSensors;}
|
||||||
|
|
||||||
long getMemoryUsed() const; // Return memory usage in Bytes
|
long getMemoryUsed() const; // Return memory usage in Bytes
|
||||||
void clearCompressedData() {_imageCompressed=cv::Mat(); _depthOrRightCompressed=cv::Mat(); _laserScanCompressed.clear(); _userDataCompressed=cv::Mat();}
|
void clearCompressedData() {_imageCompressed=cv::Mat(); _depthOrRightCompressed=cv::Mat(); _laserScanCompressed.clear(); _userDataCompressed=cv::Mat();}
|
||||||
|
|
||||||
@@ -281,6 +280,12 @@ private:
|
|||||||
float _cellSize;
|
float _cellSize;
|
||||||
cv::Point3f _viewPoint;
|
cv::Point3f _viewPoint;
|
||||||
|
|
||||||
|
// environmental sensors
|
||||||
|
EnvSensors _envSensors;
|
||||||
|
|
||||||
|
// tags
|
||||||
|
std::map<int, TransformStamped> _tags;
|
||||||
|
|
||||||
// features
|
// features
|
||||||
std::vector<cv::KeyPoint> _keypoints;
|
std::vector<cv::KeyPoint> _keypoints;
|
||||||
std::vector<cv::Point3f> _keypoints3D;
|
std::vector<cv::Point3f> _keypoints3D;
|
||||||
|
|||||||
@@ -90,6 +90,10 @@ public:
|
|||||||
void removeLink(int idTo);
|
void removeLink(int idTo);
|
||||||
void removeVirtualLinks();
|
void removeVirtualLinks();
|
||||||
|
|
||||||
|
void setTags(const std::map<int, TransformStamped> & tags) {_tags = tags;}
|
||||||
|
void addTag(int id, const TransformStamped & pose) {_tags.insert(std::make_pair(id, pose));}
|
||||||
|
const std::map<int, TransformStamped> & getTags() const {return _tags;}
|
||||||
|
|
||||||
void setSaved(bool saved) {_saved = saved;}
|
void setSaved(bool saved) {_saved = saved;}
|
||||||
void setModified(bool modified) {_modified = modified; _linksModified = modified;}
|
void setModified(bool modified) {_modified = modified; _linksModified = modified;}
|
||||||
|
|
||||||
@@ -141,6 +145,7 @@ private:
|
|||||||
int _mapId;
|
int _mapId;
|
||||||
double _stamp;
|
double _stamp;
|
||||||
std::map<int, Link> _links; // id, transform
|
std::map<int, Link> _links; // id, transform
|
||||||
|
std::map<int, TransformStamped> _tags;
|
||||||
int _weight;
|
int _weight;
|
||||||
std::string _label;
|
std::string _label;
|
||||||
bool _saved; // If it's saved to bd
|
bool _saved; // If it's saved to bd
|
||||||
|
|||||||
@@ -97,6 +97,9 @@ public:
|
|||||||
bool load(const std::string & directory, const std::string & cameraName, bool ignoreStereoTransform = true);
|
bool load(const std::string & directory, const std::string & cameraName, bool ignoreStereoTransform = true);
|
||||||
bool save(const std::string & directory, bool ignoreStereoTransform = true) const;
|
bool save(const std::string & directory, bool ignoreStereoTransform = true) const;
|
||||||
bool saveStereoTransform(const std::string & directory) const;
|
bool saveStereoTransform(const std::string & directory) const;
|
||||||
|
std::vector<unsigned char> serialize() const;
|
||||||
|
unsigned int deserialize(const std::vector<unsigned char>& data);
|
||||||
|
unsigned int deserialize(const unsigned char * data, unsigned int dataSize);
|
||||||
|
|
||||||
double baseline() const {return right_.fx()!=0.0 && left_.fx() != 0.0 ? left_.Tx() / left_.fx() - right_.Tx()/right_.fx():0.0;}
|
double baseline() const {return right_.fx()!=0.0 && left_.fx() != 0.0 ? left_.Tx() / left_.fx() - right_.Tx()/right_.fx():0.0;}
|
||||||
|
|
||||||
|
|||||||
@@ -155,6 +155,21 @@ private:
|
|||||||
|
|
||||||
RTABMAP_EXP std::ostream& operator<<(std::ostream& os, const Transform& s);
|
RTABMAP_EXP std::ostream& operator<<(std::ostream& os, const Transform& s);
|
||||||
|
|
||||||
|
class TransformStamped
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TransformStamped(const Transform & transform, const double & stamp) :
|
||||||
|
transform_(transform),
|
||||||
|
stamp_(stamp)
|
||||||
|
{}
|
||||||
|
const Transform & transform() const {return transform_;}
|
||||||
|
const double & stamp() const {return stamp_;}
|
||||||
|
|
||||||
|
private:
|
||||||
|
Transform transform_;
|
||||||
|
double stamp_;
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* TRANSFORM_H_ */
|
#endif /* TRANSFORM_H_ */
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <rtabmap/core/CameraModel.h>
|
#include <rtabmap/core/CameraModel.h>
|
||||||
|
#include <rtabmap/core/Version.h>
|
||||||
#include <rtabmap/utilite/ULogger.h>
|
#include <rtabmap/utilite/ULogger.h>
|
||||||
#include <rtabmap/utilite/UDirectory.h>
|
#include <rtabmap/utilite/UDirectory.h>
|
||||||
#include <rtabmap/utilite/UFile.h>
|
#include <rtabmap/utilite/UFile.h>
|
||||||
@@ -449,6 +450,124 @@ bool CameraModel::save(const std::string & directory) const
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<unsigned char> CameraModel::serialize() const
|
||||||
|
{
|
||||||
|
const int headerSize = 11;
|
||||||
|
int header[headerSize] = {
|
||||||
|
RTABMAP_VERSION_MAJOR, RTABMAP_VERSION_MINOR, RTABMAP_VERSION_PATCH, // 0,1,2
|
||||||
|
0, //mono // 3,
|
||||||
|
imageSize_.width, imageSize_.height, // 4,5
|
||||||
|
(int)K_.total(), (int)D_.total(), (int)R_.total(), (int)P_.total(), // 6,7,8,9
|
||||||
|
localTransform_.isNull()?0:localTransform_.size()}; // 10
|
||||||
|
UDEBUG("Header: %d %d %d %d %d %d %d %d %d %d %d", header[0],header[1],header[2],header[3],header[4],header[5],header[6],header[7],header[8],header[9],header[10]);
|
||||||
|
std::vector<unsigned char> data(
|
||||||
|
sizeof(int)*headerSize +
|
||||||
|
sizeof(double)*(K_.total()+D_.total()+R_.total()+P_.total()) +
|
||||||
|
(localTransform_.isNull()?0:sizeof(float)*localTransform_.size()));
|
||||||
|
memcpy(data.data(), header, sizeof(int)*headerSize);
|
||||||
|
int index = sizeof(int)*headerSize;
|
||||||
|
if(!K_.empty())
|
||||||
|
{
|
||||||
|
memcpy(data.data()+index, K_.data, sizeof(double)*(K_.total()));
|
||||||
|
index+=sizeof(double)*(K_.total());
|
||||||
|
}
|
||||||
|
if(!D_.empty())
|
||||||
|
{
|
||||||
|
memcpy(data.data()+index, D_.data, sizeof(double)*(D_.total()));
|
||||||
|
index+=sizeof(double)*(D_.total());
|
||||||
|
}
|
||||||
|
if(!R_.empty())
|
||||||
|
{
|
||||||
|
memcpy(data.data()+index, R_.data, sizeof(double)*(R_.total()));
|
||||||
|
index+=sizeof(double)*(R_.total());
|
||||||
|
}
|
||||||
|
if(!P_.empty())
|
||||||
|
{
|
||||||
|
memcpy(data.data()+index, P_.data, sizeof(double)*(P_.total()));
|
||||||
|
index+=sizeof(double)*(P_.total());
|
||||||
|
}
|
||||||
|
if(!localTransform_.isNull())
|
||||||
|
{
|
||||||
|
memcpy(data.data()+index, localTransform_.data(), sizeof(float)*(localTransform_.size()));
|
||||||
|
index+=sizeof(float)*(localTransform_.size());
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int CameraModel::deserialize(const std::vector<unsigned char>& data)
|
||||||
|
{
|
||||||
|
return deserialize(data.data(), data.size());
|
||||||
|
}
|
||||||
|
unsigned int CameraModel::deserialize(const unsigned char * data, unsigned int dataSize)
|
||||||
|
{
|
||||||
|
*this = CameraModel();
|
||||||
|
int headerSize = 11;
|
||||||
|
if(dataSize >= sizeof(int)*headerSize)
|
||||||
|
{
|
||||||
|
UASSERT(data != 0);
|
||||||
|
const int * header = (const int *)data;
|
||||||
|
int type = header[3];
|
||||||
|
if(type == 0)
|
||||||
|
{
|
||||||
|
imageSize_.width = header[4];
|
||||||
|
imageSize_.height = header[5];
|
||||||
|
int iK = 6;
|
||||||
|
int iD = 7;
|
||||||
|
int iR = 8;
|
||||||
|
int iP = 9;
|
||||||
|
int iL = 10;
|
||||||
|
UDEBUG("Header: %d %d %d %d %d %d %d %d %d %d %d", header[0],header[1],header[2],header[3],header[4],header[5],header[6],header[7],header[8],header[9],header[10]);
|
||||||
|
unsigned int requiredDataSize = sizeof(int)*headerSize +
|
||||||
|
sizeof(double)*(header[iK]+header[iD]+header[iR]+header[iP]) +
|
||||||
|
sizeof(float)*header[iL];
|
||||||
|
UASSERT_MSG(dataSize >= requiredDataSize,
|
||||||
|
uFormat("dataSize=%d != required=%d (header: version %d.%d.%d %dx%d type=%d K=%d D=%d R=%d P=%d L=%d)",
|
||||||
|
dataSize,
|
||||||
|
requiredDataSize,
|
||||||
|
header[0], header[1], header[2], header[4], header[5], header[3],
|
||||||
|
header[iK], header[iD], header[iR],header[iP], header[iL]).c_str());
|
||||||
|
unsigned int index = sizeof(int)*headerSize;
|
||||||
|
if(header[iK] != 0)
|
||||||
|
{
|
||||||
|
UASSERT(header[iK] == 9);
|
||||||
|
K_ = cv::Mat(3, 3, CV_64FC1, (void*)(data+index)).clone();
|
||||||
|
index+=sizeof(double)*(K_.total());
|
||||||
|
}
|
||||||
|
if(header[iD] != 0)
|
||||||
|
{
|
||||||
|
D_ = cv::Mat(1, header[iD], CV_64FC1, (void*)(data+index)).clone();
|
||||||
|
index+=sizeof(double)*(D_.total());
|
||||||
|
}
|
||||||
|
if(header[iR] != 0)
|
||||||
|
{
|
||||||
|
UASSERT(header[iR] == 9);
|
||||||
|
R_ = cv::Mat(3, 3, CV_64FC1, (void*)(data+index)).clone();
|
||||||
|
index+=sizeof(double)*(R_.total());
|
||||||
|
}
|
||||||
|
if(header[iP] != 0)
|
||||||
|
{
|
||||||
|
UASSERT(header[iP] == 12);
|
||||||
|
P_ = cv::Mat(3, 4, CV_64FC1, (void*)(data+index)).clone();
|
||||||
|
index+=sizeof(double)*(P_.total());
|
||||||
|
}
|
||||||
|
if(header[iL] != 0)
|
||||||
|
{
|
||||||
|
UASSERT(header[iL] == 12);
|
||||||
|
memcpy(localTransform_.data(), data+index, sizeof(float)*localTransform_.size());
|
||||||
|
index+=sizeof(float)*localTransform_.size();
|
||||||
|
}
|
||||||
|
UASSERT(index <= dataSize);
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UERROR("Serialized calibration is not mono (type=%d), use the appropriate class matching the type to deserialize.", type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
UERROR("Wrong serialized calibration data format detected (size in bytes=%d)! Cannot deserialize the data.", (int)dataSize);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
CameraModel CameraModel::scaled(double scale) const
|
CameraModel CameraModel::scaled(double scale) const
|
||||||
{
|
{
|
||||||
CameraModel scaledModel = *this;
|
CameraModel scaledModel = *this;
|
||||||
|
|||||||
@@ -733,7 +733,8 @@ bool DBDriver::getNodeInfo(
|
|||||||
double & stamp,
|
double & stamp,
|
||||||
Transform & groundTruthPose,
|
Transform & groundTruthPose,
|
||||||
std::vector<float> & velocity,
|
std::vector<float> & velocity,
|
||||||
GPS & gps) const
|
GPS & gps,
|
||||||
|
EnvSensors & sensors) const
|
||||||
{
|
{
|
||||||
bool found = false;
|
bool found = false;
|
||||||
// look in the trash
|
// look in the trash
|
||||||
@@ -747,6 +748,7 @@ bool DBDriver::getNodeInfo(
|
|||||||
stamp = _trashSignatures.at(signatureId)->getStamp();
|
stamp = _trashSignatures.at(signatureId)->getStamp();
|
||||||
groundTruthPose = _trashSignatures.at(signatureId)->getGroundTruthPose();
|
groundTruthPose = _trashSignatures.at(signatureId)->getGroundTruthPose();
|
||||||
gps = _trashSignatures.at(signatureId)->sensorData().gps();
|
gps = _trashSignatures.at(signatureId)->sensorData().gps();
|
||||||
|
sensors = _trashSignatures.at(signatureId)->sensorData().envSensors();
|
||||||
found = true;
|
found = true;
|
||||||
}
|
}
|
||||||
_trashesMutex.unlock();
|
_trashesMutex.unlock();
|
||||||
@@ -754,7 +756,7 @@ bool DBDriver::getNodeInfo(
|
|||||||
if(!found)
|
if(!found)
|
||||||
{
|
{
|
||||||
_dbSafeAccessMutex.lock();
|
_dbSafeAccessMutex.lock();
|
||||||
found = this->getNodeInfoQuery(signatureId, pose, mapId, weight, label, stamp, groundTruthPose, velocity, gps);
|
found = this->getNodeInfoQuery(signatureId, pose, mapId, weight, label, stamp, groundTruthPose, velocity, gps, sensors);
|
||||||
_dbSafeAccessMutex.unlock();
|
_dbSafeAccessMutex.unlock();
|
||||||
}
|
}
|
||||||
return found;
|
return found;
|
||||||
@@ -790,6 +792,33 @@ void DBDriver::loadLinks(int signatureId, std::map<int, Link> & links, Link::Typ
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DBDriver::loadTags(int signatureId, std::map<int, TransformStamped> & tags) const
|
||||||
|
{
|
||||||
|
bool found = false;
|
||||||
|
// look in the trash
|
||||||
|
_trashesMutex.lock();
|
||||||
|
if(uContains(_trashSignatures, signatureId))
|
||||||
|
{
|
||||||
|
const Signature * s = _trashSignatures.at(signatureId);
|
||||||
|
UASSERT(s != 0);
|
||||||
|
for(std::map<int, TransformStamped>::const_iterator nIter = s->getTags().begin();
|
||||||
|
nIter!=s->getTags().end();
|
||||||
|
++nIter)
|
||||||
|
{
|
||||||
|
tags.insert(*nIter);
|
||||||
|
}
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
_trashesMutex.unlock();
|
||||||
|
|
||||||
|
if(!found)
|
||||||
|
{
|
||||||
|
_dbSafeAccessMutex.lock();
|
||||||
|
this->loadTagsQuery(signatureId, tags);
|
||||||
|
_dbSafeAccessMutex.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void DBDriver::getWeight(int signatureId, int & weight) const
|
void DBDriver::getWeight(int signatureId, int & weight) const
|
||||||
{
|
{
|
||||||
bool found = false;
|
bool found = false;
|
||||||
|
|||||||
+777
-295
File diff suppressed because it is too large
Load Diff
@@ -268,7 +268,8 @@ SensorData DBReader::captureImage(CameraInfo * info)
|
|||||||
Transform localTransform, pose, groundTruth;
|
Transform localTransform, pose, groundTruth;
|
||||||
std::vector<float> velocity;
|
std::vector<float> velocity;
|
||||||
GPS gps;
|
GPS gps;
|
||||||
_dbDriver->getNodeInfo(*_currentId, pose, mapId, weight, label, stamp, groundTruth, velocity, gps);
|
EnvSensors sensors;
|
||||||
|
_dbDriver->getNodeInfo(*_currentId, pose, mapId, weight, label, stamp, groundTruth, velocity, gps, sensors);
|
||||||
if(previousStamp && stamp && stamp > previousStamp)
|
if(previousStamp && stamp && stamp > previousStamp)
|
||||||
{
|
{
|
||||||
delay = stamp - previousStamp;
|
delay = stamp - previousStamp;
|
||||||
@@ -323,7 +324,8 @@ SensorData DBReader::getNextData(CameraInfo * info)
|
|||||||
Transform groundTruth;
|
Transform groundTruth;
|
||||||
std::vector<float> velocity;
|
std::vector<float> velocity;
|
||||||
GPS gps;
|
GPS gps;
|
||||||
_dbDriver->getNodeInfo(*_currentId, pose, mapId, weight, label, stamp, groundTruth, velocity, gps);
|
EnvSensors sensors;
|
||||||
|
_dbDriver->getNodeInfo(*_currentId, pose, mapId, weight, label, stamp, groundTruth, velocity, gps, sensors);
|
||||||
|
|
||||||
cv::Mat infMatrix = cv::Mat::eye(6,6,CV_64FC1);
|
cv::Mat infMatrix = cv::Mat::eye(6,6,CV_64FC1);
|
||||||
if(!_odometryIgnored)
|
if(!_odometryIgnored)
|
||||||
@@ -437,6 +439,7 @@ SensorData DBReader::getNextData(CameraInfo * info)
|
|||||||
data.setStamp(stamp);
|
data.setStamp(stamp);
|
||||||
data.setGroundTruth(groundTruth);
|
data.setGroundTruth(groundTruth);
|
||||||
data.setGPS(gps);
|
data.setGPS(gps);
|
||||||
|
data.setEnvSensors(sensors);
|
||||||
UDEBUG("Laser=%d RGB/Left=%d Depth/Right=%d, UserData=%d",
|
UDEBUG("Laser=%d RGB/Left=%d Depth/Right=%d, UserData=%d",
|
||||||
data.laserScanRaw().isEmpty()?0:1,
|
data.laserScanRaw().isEmpty()?0:1,
|
||||||
data.imageRaw().empty()?0:1,
|
data.imageRaw().empty()?0:1,
|
||||||
|
|||||||
+124
-7
@@ -81,7 +81,11 @@ bool LaserScan::isScanHasIntensity(const Format & format)
|
|||||||
return format==kXYZI || format==kXYZINormal || format == kXYI || format == kXYINormal;
|
return format==kXYZI || format==kXYZINormal || format == kXYI || format == kXYINormal;
|
||||||
}
|
}
|
||||||
|
|
||||||
LaserScan LaserScan::backwardCompatibility(const cv::Mat & oldScanFormat, int maxPoints, int maxRange, const Transform & localTransform)
|
LaserScan LaserScan::backwardCompatibility(
|
||||||
|
const cv::Mat & oldScanFormat,
|
||||||
|
int maxPoints,
|
||||||
|
int maxRange,
|
||||||
|
const Transform & localTransform)
|
||||||
{
|
{
|
||||||
if(!oldScanFormat.empty())
|
if(!oldScanFormat.empty())
|
||||||
{
|
{
|
||||||
@@ -113,19 +117,71 @@ LaserScan LaserScan::backwardCompatibility(const cv::Mat & oldScanFormat, int ma
|
|||||||
return LaserScan();
|
return LaserScan();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LaserScan LaserScan::backwardCompatibility(
|
||||||
|
const cv::Mat & oldScanFormat,
|
||||||
|
float minRange,
|
||||||
|
float maxRange,
|
||||||
|
float angleMin,
|
||||||
|
float angleMax,
|
||||||
|
float angleInc,
|
||||||
|
const Transform & localTransform)
|
||||||
|
{
|
||||||
|
if(!oldScanFormat.empty())
|
||||||
|
{
|
||||||
|
if(oldScanFormat.channels() == 2)
|
||||||
|
{
|
||||||
|
return LaserScan(oldScanFormat, kXY, minRange, maxRange, angleMin, angleMax, angleInc, localTransform);
|
||||||
|
}
|
||||||
|
else if(oldScanFormat.channels() == 3)
|
||||||
|
{
|
||||||
|
return LaserScan(oldScanFormat, kXYZ, minRange, maxRange, angleMin, angleMax, angleInc, localTransform);
|
||||||
|
}
|
||||||
|
else if(oldScanFormat.channels() == 4)
|
||||||
|
{
|
||||||
|
return LaserScan(oldScanFormat, kXYZRGB, minRange, maxRange, angleMin, angleMax, angleInc, localTransform);
|
||||||
|
}
|
||||||
|
else if(oldScanFormat.channels() == 5)
|
||||||
|
{
|
||||||
|
return LaserScan(oldScanFormat, kXYNormal, minRange, maxRange, angleMin, angleMax, angleInc, localTransform);
|
||||||
|
}
|
||||||
|
else if(oldScanFormat.channels() == 6)
|
||||||
|
{
|
||||||
|
return LaserScan(oldScanFormat, kXYZNormal, minRange, maxRange, angleMin, angleMax, angleInc, localTransform);
|
||||||
|
}
|
||||||
|
else if(oldScanFormat.channels() == 7)
|
||||||
|
{
|
||||||
|
return LaserScan(oldScanFormat, kXYZRGBNormal, minRange, maxRange, angleMin, angleMax, angleInc, localTransform);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return LaserScan();
|
||||||
|
}
|
||||||
|
|
||||||
LaserScan::LaserScan() :
|
LaserScan::LaserScan() :
|
||||||
maxPoints_(0),
|
|
||||||
maxRange_(0),
|
|
||||||
format_(kUnknown),
|
format_(kUnknown),
|
||||||
|
maxPoints_(0),
|
||||||
|
rangeMin_(0),
|
||||||
|
rangeMax_(0),
|
||||||
|
angleMin_(0),
|
||||||
|
angleMax_(0),
|
||||||
|
angleIncrement_(0),
|
||||||
localTransform_(Transform::getIdentity())
|
localTransform_(Transform::getIdentity())
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
LaserScan::LaserScan(const cv::Mat & data, int maxPoints, float maxRange, Format format, const Transform & localTransform) :
|
LaserScan::LaserScan(
|
||||||
|
const cv::Mat & data,
|
||||||
|
int maxPoints,
|
||||||
|
float maxRange,
|
||||||
|
Format format,
|
||||||
|
const Transform & localTransform) :
|
||||||
data_(data),
|
data_(data),
|
||||||
maxPoints_(maxPoints),
|
|
||||||
maxRange_(maxRange),
|
|
||||||
format_(format),
|
format_(format),
|
||||||
|
maxPoints_(maxPoints),
|
||||||
|
rangeMin_(0),
|
||||||
|
rangeMax_(maxRange),
|
||||||
|
angleMin_(0),
|
||||||
|
angleMax_(0),
|
||||||
|
angleIncrement_(0),
|
||||||
localTransform_(localTransform)
|
localTransform_(localTransform)
|
||||||
{
|
{
|
||||||
UASSERT(data.empty() || data.rows == 1);
|
UASSERT(data.empty() || data.rows == 1);
|
||||||
@@ -136,7 +192,7 @@ LaserScan::LaserScan(const cv::Mat & data, int maxPoints, float maxRange, Format
|
|||||||
{
|
{
|
||||||
if(format == kUnknown)
|
if(format == kUnknown)
|
||||||
{
|
{
|
||||||
*this = backwardCompatibility(data_, maxPoints_, maxRange_, localTransform_);
|
*this = backwardCompatibility(data_, maxPoints_, rangeMax_, localTransform_);
|
||||||
}
|
}
|
||||||
else // verify that format corresponds to expected number of channels
|
else // verify that format corresponds to expected number of channels
|
||||||
{
|
{
|
||||||
@@ -150,4 +206,65 @@ LaserScan::LaserScan(const cv::Mat & data, int maxPoints, float maxRange, Format
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LaserScan::LaserScan(
|
||||||
|
const cv::Mat & data,
|
||||||
|
Format format,
|
||||||
|
float minRange,
|
||||||
|
float maxRange,
|
||||||
|
float angleMin,
|
||||||
|
float angleMax,
|
||||||
|
float angleIncrement,
|
||||||
|
const Transform & localTransform) :
|
||||||
|
data_(data),
|
||||||
|
format_(format),
|
||||||
|
rangeMin_(minRange),
|
||||||
|
rangeMax_(maxRange),
|
||||||
|
angleMin_(angleMin),
|
||||||
|
angleMax_(angleMax),
|
||||||
|
angleIncrement_(angleIncrement),
|
||||||
|
localTransform_(localTransform)
|
||||||
|
{
|
||||||
|
UASSERT(maxRange>minRange);
|
||||||
|
UASSERT(angleMax>angleMin);
|
||||||
|
UASSERT(angleIncrement != 0.0f);
|
||||||
|
maxPoints_ = std::ceil((angleMax - angleMin) / angleIncrement);
|
||||||
|
|
||||||
|
UASSERT(data.empty() || data.rows == 1);
|
||||||
|
UASSERT(data.empty() || data.type() == CV_8UC1 || data.type() == CV_32FC2 || data.type() == CV_32FC3 || data.type() == CV_32FC(4) || data.type() == CV_32FC(5) || data.type() == CV_32FC(6) || data.type() == CV_32FC(7));
|
||||||
|
UASSERT(!localTransform.isNull());
|
||||||
|
|
||||||
|
if(!data.empty() && !isCompressed())
|
||||||
|
{
|
||||||
|
if(data_.cols > maxPoints_)
|
||||||
|
{
|
||||||
|
UWARN("The number of points (%d) in the scan is over the maximum "
|
||||||
|
"points (%d) defined by angle settings (min=%f max=%f inc=%f). "
|
||||||
|
"The scan info may be wrong!",
|
||||||
|
data_.cols, maxPoints_, angleMin_, angleMax_, angleIncrement_);
|
||||||
|
}
|
||||||
|
if(format == kUnknown)
|
||||||
|
{
|
||||||
|
*this = backwardCompatibility(data_, rangeMin_, rangeMax_, angleMin_, angleMax_, angleIncrement_, localTransform_);
|
||||||
|
}
|
||||||
|
else // verify that format corresponds to expected number of channels
|
||||||
|
{
|
||||||
|
UASSERT_MSG(data.channels() != 2 || (data.channels() == 2 && format == kXY), uFormat("format=%d", format).c_str());
|
||||||
|
UASSERT_MSG(data.channels() != 3 || (data.channels() == 3 && (format == kXYZ || format == kXYI)), uFormat("format=%d", format).c_str());
|
||||||
|
UASSERT_MSG(data.channels() != 4 || (data.channels() == 4 && (format == kXYZI || format == kXYZRGB)), uFormat("format=%d", format).c_str());
|
||||||
|
UASSERT_MSG(data.channels() != 5 || (data.channels() == 5 && (format == kXYNormal)), uFormat("format=%d", format).c_str());
|
||||||
|
UASSERT_MSG(data.channels() != 6 || (data.channels() == 6 && (format == kXYINormal || format == kXYZNormal)), uFormat("format=%d", format).c_str());
|
||||||
|
UASSERT_MSG(data.channels() != 7 || (data.channels() == 7 && (format == kXYZRGBNormal || format == kXYZINormal)), uFormat("format=%d", format).c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
LaserScan LaserScan::clone() const
|
||||||
|
{
|
||||||
|
if(angleIncrement_ > 0.0f)
|
||||||
|
{
|
||||||
|
return LaserScan(data_.clone(), format_, rangeMin_, rangeMax_, angleMin_, angleMax_, angleIncrement_, localTransform_.clone());
|
||||||
|
}
|
||||||
|
return LaserScan(data_.clone(), maxPoints_, rangeMax_, format_, localTransform_.clone());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+71
-13
@@ -2796,11 +2796,11 @@ Transform Memory::computeIcpTransformMulti(
|
|||||||
{
|
{
|
||||||
Transform guess = poses.at(fromId).inverse() * poses.at(toId);
|
Transform guess = poses.at(fromId).inverse() * poses.at(toId);
|
||||||
float guessNorm = guess.getNorm();
|
float guessNorm = guess.getNorm();
|
||||||
if(fromScan.maxRange() > 0.0f && toScan.maxRange() > 0.0f &&
|
if(fromScan.rangeMax() > 0.0f && toScan.rangeMax() > 0.0f &&
|
||||||
guessNorm > fromScan.maxRange() + toScan.maxRange())
|
guessNorm > fromScan.rangeMax() + toScan.rangeMax())
|
||||||
{
|
{
|
||||||
// stop right known,it is impossible that scans overlay.
|
// stop right known,it is impossible that scans overlay.
|
||||||
UINFO("Too far scans between %d and %d to compute transformation: guessNorm=%f, scan range from=%f to=%f", fromId, toId, guessNorm, fromScan.maxRange(), toScan.maxRange());
|
UINFO("Too far scans between %d and %d to compute transformation: guessNorm=%f, scan range from=%f to=%f", fromId, toId, guessNorm, fromScan.rangeMax(), toScan.rangeMax());
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2890,7 +2890,7 @@ Transform Memory::computeIcpTransformMulti(
|
|||||||
assembledData.setLaserScanRaw(
|
assembledData.setLaserScanRaw(
|
||||||
LaserScan(assembledScan,
|
LaserScan(assembledScan,
|
||||||
fromScan.maxPoints()?fromScan.maxPoints():maxPoints,
|
fromScan.maxPoints()?fromScan.maxPoints():maxPoints,
|
||||||
fromScan.maxRange(),
|
fromScan.rangeMax(),
|
||||||
fromScan.format(),
|
fromScan.format(),
|
||||||
fromScan.is2d()?Transform(0,0,fromScan.localTransform().z(),0,0,0):Transform::getIdentity()));
|
fromScan.is2d()?Transform(0,0,fromScan.localTransform().z(),0,0,0):Transform::getIdentity()));
|
||||||
|
|
||||||
@@ -3430,7 +3430,8 @@ Transform Memory::getOdomPose(int signatureId, bool lookInDatabase) const
|
|||||||
double stamp;
|
double stamp;
|
||||||
std::vector<float> velocity;
|
std::vector<float> velocity;
|
||||||
GPS gps;
|
GPS gps;
|
||||||
getNodeInfo(signatureId, pose, mapId, weight, label, stamp, groundTruth, velocity, gps, lookInDatabase);
|
EnvSensors sensors;
|
||||||
|
getNodeInfo(signatureId, pose, mapId, weight, label, stamp, groundTruth, velocity, gps, sensors, lookInDatabase);
|
||||||
return pose;
|
return pose;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3442,7 +3443,8 @@ Transform Memory::getGroundTruthPose(int signatureId, bool lookInDatabase) const
|
|||||||
double stamp;
|
double stamp;
|
||||||
std::vector<float> velocity;
|
std::vector<float> velocity;
|
||||||
GPS gps;
|
GPS gps;
|
||||||
getNodeInfo(signatureId, pose, mapId, weight, label, stamp, groundTruth, velocity, gps, lookInDatabase);
|
EnvSensors sensors;
|
||||||
|
getNodeInfo(signatureId, pose, mapId, weight, label, stamp, groundTruth, velocity, gps, sensors, lookInDatabase);
|
||||||
return groundTruth;
|
return groundTruth;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3456,7 +3458,8 @@ void Memory::getGPS(int id, GPS & gps, Transform & offsetENU, bool lookInDatabas
|
|||||||
std::string label;
|
std::string label;
|
||||||
double stamp;
|
double stamp;
|
||||||
std::vector<float> velocity;
|
std::vector<float> velocity;
|
||||||
getNodeInfo(id, odomPose, mapId, weight, label, stamp, groundTruth, velocity, gps, lookInDatabase);
|
EnvSensors sensors;
|
||||||
|
getNodeInfo(id, odomPose, mapId, weight, label, stamp, groundTruth, velocity, gps, sensors, lookInDatabase);
|
||||||
|
|
||||||
if(gps.stamp() == 0.0)
|
if(gps.stamp() == 0.0)
|
||||||
{
|
{
|
||||||
@@ -3502,6 +3505,7 @@ bool Memory::getNodeInfo(int signatureId,
|
|||||||
Transform & groundTruth,
|
Transform & groundTruth,
|
||||||
std::vector<float> & velocity,
|
std::vector<float> & velocity,
|
||||||
GPS & gps,
|
GPS & gps,
|
||||||
|
EnvSensors & sensors,
|
||||||
bool lookInDatabase) const
|
bool lookInDatabase) const
|
||||||
{
|
{
|
||||||
const Signature * s = this->getSignature(signatureId);
|
const Signature * s = this->getSignature(signatureId);
|
||||||
@@ -3515,11 +3519,12 @@ bool Memory::getNodeInfo(int signatureId,
|
|||||||
groundTruth = s->getGroundTruthPose();
|
groundTruth = s->getGroundTruthPose();
|
||||||
velocity = s->getVelocity();
|
velocity = s->getVelocity();
|
||||||
gps = s->sensorData().gps();
|
gps = s->sensorData().gps();
|
||||||
|
sensors = s->sensorData().envSensors();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if(lookInDatabase && _dbDriver)
|
else if(lookInDatabase && _dbDriver)
|
||||||
{
|
{
|
||||||
return _dbDriver->getNodeInfo(signatureId, odomPose, mapId, weight, label, stamp, groundTruth, velocity, gps);
|
return _dbDriver->getNodeInfo(signatureId, odomPose, mapId, weight, label, stamp, groundTruth, velocity, gps, sensors);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -4451,7 +4456,7 @@ Signature * Memory::createSignature(const SensorData & inputData, const Transfor
|
|||||||
LaserScan laserScan = data.laserScanRaw();
|
LaserScan laserScan = data.laserScanRaw();
|
||||||
if(!isIntermediateNode && laserScan.size())
|
if(!isIntermediateNode && laserScan.size())
|
||||||
{
|
{
|
||||||
if(laserScan.maxRange() == 0.0f)
|
if(laserScan.rangeMax() == 0.0f)
|
||||||
{
|
{
|
||||||
bool id2d = laserScan.is2d();
|
bool id2d = laserScan.is2d();
|
||||||
float maxRange = 0.0f;
|
float maxRange = 0.0f;
|
||||||
@@ -4561,7 +4566,20 @@ Signature * Memory::createSignature(const SensorData & inputData, const Transfor
|
|||||||
data.groundTruth(),
|
data.groundTruth(),
|
||||||
stereoCameraModel.isValidForProjection()?
|
stereoCameraModel.isValidForProjection()?
|
||||||
SensorData(
|
SensorData(
|
||||||
LaserScan(compressedScan, laserScan.maxPoints(), laserScan.maxRange(), laserScan.format(), laserScan.localTransform()),
|
laserScan.angleIncrement() == 0.0f?
|
||||||
|
LaserScan(compressedScan,
|
||||||
|
laserScan.maxPoints(),
|
||||||
|
laserScan.rangeMax(),
|
||||||
|
laserScan.format(),
|
||||||
|
laserScan.localTransform()):
|
||||||
|
LaserScan(compressedScan,
|
||||||
|
laserScan.format(),
|
||||||
|
laserScan.rangeMin(),
|
||||||
|
laserScan.rangeMax(),
|
||||||
|
laserScan.angleMin(),
|
||||||
|
laserScan.angleMax(),
|
||||||
|
laserScan.angleIncrement(),
|
||||||
|
laserScan.localTransform()),
|
||||||
compressedImage,
|
compressedImage,
|
||||||
compressedDepth,
|
compressedDepth,
|
||||||
stereoCameraModel,
|
stereoCameraModel,
|
||||||
@@ -4569,7 +4587,20 @@ Signature * Memory::createSignature(const SensorData & inputData, const Transfor
|
|||||||
0,
|
0,
|
||||||
compressedUserData):
|
compressedUserData):
|
||||||
SensorData(
|
SensorData(
|
||||||
LaserScan(compressedScan, laserScan.maxPoints(), laserScan.maxRange(), laserScan.format(), laserScan.localTransform()),
|
laserScan.angleIncrement() == 0.0f?
|
||||||
|
LaserScan(compressedScan,
|
||||||
|
laserScan.maxPoints(),
|
||||||
|
laserScan.rangeMax(),
|
||||||
|
laserScan.format(),
|
||||||
|
laserScan.localTransform()):
|
||||||
|
LaserScan(compressedScan,
|
||||||
|
laserScan.format(),
|
||||||
|
laserScan.rangeMin(),
|
||||||
|
laserScan.rangeMax(),
|
||||||
|
laserScan.angleMin(),
|
||||||
|
laserScan.angleMax(),
|
||||||
|
laserScan.angleIncrement(),
|
||||||
|
laserScan.localTransform()),
|
||||||
compressedImage,
|
compressedImage,
|
||||||
compressedDepth,
|
compressedDepth,
|
||||||
cameraModels,
|
cameraModels,
|
||||||
@@ -4619,7 +4650,20 @@ Signature * Memory::createSignature(const SensorData & inputData, const Transfor
|
|||||||
data.groundTruth(),
|
data.groundTruth(),
|
||||||
stereoCameraModel.isValidForProjection()?
|
stereoCameraModel.isValidForProjection()?
|
||||||
SensorData(
|
SensorData(
|
||||||
LaserScan(compressedScan, laserScan.maxPoints(), laserScan.maxRange(), laserScan.format(), laserScan.localTransform()),
|
laserScan.angleIncrement() == 0.0f?
|
||||||
|
LaserScan(compressedScan,
|
||||||
|
laserScan.maxPoints(),
|
||||||
|
laserScan.rangeMax(),
|
||||||
|
laserScan.format(),
|
||||||
|
laserScan.localTransform()):
|
||||||
|
LaserScan(compressedScan,
|
||||||
|
laserScan.format(),
|
||||||
|
laserScan.rangeMin(),
|
||||||
|
laserScan.rangeMax(),
|
||||||
|
laserScan.angleMin(),
|
||||||
|
laserScan.angleMax(),
|
||||||
|
laserScan.angleIncrement(),
|
||||||
|
laserScan.localTransform()),
|
||||||
cv::Mat(),
|
cv::Mat(),
|
||||||
cv::Mat(),
|
cv::Mat(),
|
||||||
stereoCameraModel,
|
stereoCameraModel,
|
||||||
@@ -4627,7 +4671,20 @@ Signature * Memory::createSignature(const SensorData & inputData, const Transfor
|
|||||||
0,
|
0,
|
||||||
compressedUserData):
|
compressedUserData):
|
||||||
SensorData(
|
SensorData(
|
||||||
LaserScan(compressedScan, laserScan.maxPoints(), laserScan.maxRange(), laserScan.format(), laserScan.localTransform()),
|
laserScan.angleIncrement() == 0.0f?
|
||||||
|
LaserScan(compressedScan,
|
||||||
|
laserScan.maxPoints(),
|
||||||
|
laserScan.rangeMax(),
|
||||||
|
laserScan.format(),
|
||||||
|
laserScan.localTransform()):
|
||||||
|
LaserScan(compressedScan,
|
||||||
|
laserScan.format(),
|
||||||
|
laserScan.rangeMin(),
|
||||||
|
laserScan.rangeMax(),
|
||||||
|
laserScan.angleMin(),
|
||||||
|
laserScan.angleMax(),
|
||||||
|
laserScan.angleIncrement(),
|
||||||
|
laserScan.localTransform()),
|
||||||
cv::Mat(),
|
cv::Mat(),
|
||||||
cv::Mat(),
|
cv::Mat(),
|
||||||
cameraModels,
|
cameraModels,
|
||||||
@@ -4648,6 +4705,7 @@ Signature * Memory::createSignature(const SensorData & inputData, const Transfor
|
|||||||
|
|
||||||
s->sensorData().setGroundTruth(data.groundTruth());
|
s->sensorData().setGroundTruth(data.groundTruth());
|
||||||
s->sensorData().setGPS(data.gps());
|
s->sensorData().setGPS(data.gps());
|
||||||
|
s->sensorData().setEnvSensors(data.envSensors());
|
||||||
|
|
||||||
t = timer.ticks();
|
t = timer.ticks();
|
||||||
if(stats) stats->addStatistic(Statistics::kTimingMemCompressing_data(), t*1000.0f);
|
if(stats) stats->addStatistic(Statistics::kTimingMemCompressing_data(), t*1000.0f);
|
||||||
|
|||||||
@@ -305,13 +305,13 @@ void OccupancyGrid::createLocalMap(
|
|||||||
}
|
}
|
||||||
|
|
||||||
float maxRange = cloudMaxDepth_;
|
float maxRange = cloudMaxDepth_;
|
||||||
if(cloudMaxDepth_>0.0f && node.sensorData().laserScanRaw().maxRange()>0.0f)
|
if(cloudMaxDepth_>0.0f && node.sensorData().laserScanRaw().rangeMax()>0.0f)
|
||||||
{
|
{
|
||||||
maxRange = cloudMaxDepth_ < node.sensorData().laserScanRaw().maxRange()?cloudMaxDepth_:node.sensorData().laserScanRaw().maxRange();
|
maxRange = cloudMaxDepth_ < node.sensorData().laserScanRaw().rangeMax()?cloudMaxDepth_:node.sensorData().laserScanRaw().rangeMax();
|
||||||
}
|
}
|
||||||
else if(scan2dUnknownSpaceFilled_ && node.sensorData().laserScanRaw().maxRange()>0.0f)
|
else if(scan2dUnknownSpaceFilled_ && node.sensorData().laserScanRaw().rangeMax()>0.0f)
|
||||||
{
|
{
|
||||||
maxRange = node.sensorData().laserScanRaw().maxRange();
|
maxRange = node.sensorData().laserScanRaw().rangeMax();
|
||||||
}
|
}
|
||||||
util3d::occupancy2DFromLaserScan(
|
util3d::occupancy2DFromLaserScan(
|
||||||
util3d::transformLaserScan(scan, node.sensorData().laserScanRaw().localTransform()).data(),
|
util3d::transformLaserScan(scan, node.sensorData().laserScanRaw().localTransform()).data(),
|
||||||
|
|||||||
@@ -610,7 +610,7 @@ Transform RegistrationIcp::computeTransformationImpl(
|
|||||||
{
|
{
|
||||||
// Load point clouds
|
// Load point clouds
|
||||||
DP data = laserScanToDP(fromScan);
|
DP data = laserScanToDP(fromScan);
|
||||||
DP ref = laserScanToDP(LaserScan(toScan.data(), toScan.maxPoints(), toScan.maxRange(), toScan.format(), guess * toScan.localTransform()));
|
DP ref = laserScanToDP(LaserScan(toScan.data(), toScan.maxPoints(), toScan.rangeMax(), toScan.format(), guess * toScan.localTransform()));
|
||||||
|
|
||||||
// Compute the transformation to express data in ref
|
// Compute the transformation to express data in ref
|
||||||
PM::TransformationParameters T;
|
PM::TransformationParameters T;
|
||||||
@@ -786,7 +786,7 @@ Transform RegistrationIcp::computeTransformationImpl(
|
|||||||
LaserScan(
|
LaserScan(
|
||||||
util3d::laserScan2dFromPointCloud(*fromCloudNormals, fromScan.localTransform().inverse()),
|
util3d::laserScan2dFromPointCloud(*fromCloudNormals, fromScan.localTransform().inverse()),
|
||||||
maxLaserScansFrom,
|
maxLaserScansFrom,
|
||||||
fromScan.maxRange(),
|
fromScan.rangeMax(),
|
||||||
LaserScan::kXYNormal,
|
LaserScan::kXYNormal,
|
||||||
fromScan.localTransform()));
|
fromScan.localTransform()));
|
||||||
}
|
}
|
||||||
@@ -796,7 +796,7 @@ Transform RegistrationIcp::computeTransformationImpl(
|
|||||||
LaserScan(
|
LaserScan(
|
||||||
util3d::laserScanFromPointCloud(*fromCloudNormals, fromScan.localTransform().inverse()),
|
util3d::laserScanFromPointCloud(*fromCloudNormals, fromScan.localTransform().inverse()),
|
||||||
maxLaserScansFrom,
|
maxLaserScansFrom,
|
||||||
fromScan.maxRange(),
|
fromScan.rangeMax(),
|
||||||
LaserScan::kXYZNormal,
|
LaserScan::kXYZNormal,
|
||||||
fromScan.localTransform()));
|
fromScan.localTransform()));
|
||||||
}
|
}
|
||||||
@@ -806,7 +806,7 @@ Transform RegistrationIcp::computeTransformationImpl(
|
|||||||
LaserScan(
|
LaserScan(
|
||||||
util3d::laserScan2dFromPointCloud(*toCloudNormals, (guess*toScan.localTransform()).inverse()),
|
util3d::laserScan2dFromPointCloud(*toCloudNormals, (guess*toScan.localTransform()).inverse()),
|
||||||
maxLaserScansTo,
|
maxLaserScansTo,
|
||||||
toScan.maxRange(),
|
toScan.rangeMax(),
|
||||||
LaserScan::kXYNormal,
|
LaserScan::kXYNormal,
|
||||||
toScan.localTransform()));
|
toScan.localTransform()));
|
||||||
}
|
}
|
||||||
@@ -816,7 +816,7 @@ Transform RegistrationIcp::computeTransformationImpl(
|
|||||||
LaserScan(
|
LaserScan(
|
||||||
util3d::laserScanFromPointCloud(*toCloudNormals, (guess*toScan.localTransform()).inverse()),
|
util3d::laserScanFromPointCloud(*toCloudNormals, (guess*toScan.localTransform()).inverse()),
|
||||||
maxLaserScansTo,
|
maxLaserScansTo,
|
||||||
toScan.maxRange(),
|
toScan.rangeMax(),
|
||||||
LaserScan::kXYZNormal,
|
LaserScan::kXYZNormal,
|
||||||
toScan.localTransform()));
|
toScan.localTransform()));
|
||||||
}
|
}
|
||||||
@@ -833,7 +833,7 @@ Transform RegistrationIcp::computeTransformationImpl(
|
|||||||
{
|
{
|
||||||
// Load point clouds
|
// Load point clouds
|
||||||
DP data = laserScanToDP(fromScan);
|
DP data = laserScanToDP(fromScan);
|
||||||
DP ref = laserScanToDP(LaserScan(toScan.data(), toScan.maxPoints(), toScan.maxRange(), toScan.format(), guess*toScan.localTransform()));
|
DP ref = laserScanToDP(LaserScan(toScan.data(), toScan.maxPoints(), toScan.rangeMax(), toScan.format(), guess*toScan.localTransform()));
|
||||||
|
|
||||||
// Compute the transformation to express data in ref
|
// Compute the transformation to express data in ref
|
||||||
PM::TransformationParameters T;
|
PM::TransformationParameters T;
|
||||||
@@ -905,7 +905,7 @@ Transform RegistrationIcp::computeTransformationImpl(
|
|||||||
LaserScan(
|
LaserScan(
|
||||||
util3d::laserScan2dFromPointCloud(*fromCloudFiltered, fromScan.localTransform().inverse()),
|
util3d::laserScan2dFromPointCloud(*fromCloudFiltered, fromScan.localTransform().inverse()),
|
||||||
maxLaserScansFrom,
|
maxLaserScansFrom,
|
||||||
fromScan.maxRange(),
|
fromScan.rangeMax(),
|
||||||
LaserScan::kXY,
|
LaserScan::kXY,
|
||||||
fromScan.localTransform()));
|
fromScan.localTransform()));
|
||||||
}
|
}
|
||||||
@@ -915,7 +915,7 @@ Transform RegistrationIcp::computeTransformationImpl(
|
|||||||
LaserScan(
|
LaserScan(
|
||||||
util3d::laserScanFromPointCloud(*fromCloudFiltered, fromScan.localTransform().inverse()),
|
util3d::laserScanFromPointCloud(*fromCloudFiltered, fromScan.localTransform().inverse()),
|
||||||
maxLaserScansFrom,
|
maxLaserScansFrom,
|
||||||
fromScan.maxRange(),
|
fromScan.rangeMax(),
|
||||||
LaserScan::kXYZ,
|
LaserScan::kXYZ,
|
||||||
fromScan.localTransform()));
|
fromScan.localTransform()));
|
||||||
}
|
}
|
||||||
@@ -925,7 +925,7 @@ Transform RegistrationIcp::computeTransformationImpl(
|
|||||||
LaserScan(
|
LaserScan(
|
||||||
util3d::laserScan2dFromPointCloud(*toCloudFiltered, (guess*toScan.localTransform()).inverse()),
|
util3d::laserScan2dFromPointCloud(*toCloudFiltered, (guess*toScan.localTransform()).inverse()),
|
||||||
maxLaserScansTo,
|
maxLaserScansTo,
|
||||||
toScan.maxRange(),
|
toScan.rangeMax(),
|
||||||
LaserScan::kXY,
|
LaserScan::kXY,
|
||||||
toScan.localTransform()));
|
toScan.localTransform()));
|
||||||
}
|
}
|
||||||
@@ -935,7 +935,7 @@ Transform RegistrationIcp::computeTransformationImpl(
|
|||||||
LaserScan(
|
LaserScan(
|
||||||
util3d::laserScanFromPointCloud(*toCloudFiltered, (guess*toScan.localTransform()).inverse()),
|
util3d::laserScanFromPointCloud(*toCloudFiltered, (guess*toScan.localTransform()).inverse()),
|
||||||
maxLaserScansTo,
|
maxLaserScansTo,
|
||||||
toScan.maxRange(),
|
toScan.rangeMax(),
|
||||||
LaserScan::kXYZ,
|
LaserScan::kXYZ,
|
||||||
toScan.localTransform()));
|
toScan.localTransform()));
|
||||||
}
|
}
|
||||||
@@ -948,7 +948,7 @@ Transform RegistrationIcp::computeTransformationImpl(
|
|||||||
{
|
{
|
||||||
// Load point clouds
|
// Load point clouds
|
||||||
DP data = laserScanToDP(fromScan);
|
DP data = laserScanToDP(fromScan);
|
||||||
DP ref = laserScanToDP(LaserScan(toScan.data(), toScan.maxPoints(), toScan.maxRange(), toScan.format(), guess*toScan.localTransform()));
|
DP ref = laserScanToDP(LaserScan(toScan.data(), toScan.maxPoints(), toScan.rangeMax(), toScan.format(), guess*toScan.localTransform()));
|
||||||
|
|
||||||
// Compute the transformation to express data in ref
|
// Compute the transformation to express data in ref
|
||||||
PM::TransformationParameters T;
|
PM::TransformationParameters T;
|
||||||
|
|||||||
+11
-4
@@ -824,7 +824,8 @@ void Rtabmap::exportPoses(const std::string & path, bool optimized, bool global,
|
|||||||
double stamp = 0.0;
|
double stamp = 0.0;
|
||||||
std::vector<float> v;
|
std::vector<float> v;
|
||||||
GPS gps;
|
GPS gps;
|
||||||
_memory->getNodeInfo(iter->first, o, m, w, l, stamp, g, v, gps, true);
|
EnvSensors sensors;
|
||||||
|
_memory->getNodeInfo(iter->first, o, m, w, l, stamp, g, v, gps, sensors, true);
|
||||||
stamps.insert(std::make_pair(iter->first, stamp));
|
stamps.insert(std::make_pair(iter->first, stamp));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2928,7 +2929,8 @@ bool Rtabmap::process(
|
|||||||
Transform groundTruth;
|
Transform groundTruth;
|
||||||
std::vector<float> velocity;
|
std::vector<float> velocity;
|
||||||
GPS gps;
|
GPS gps;
|
||||||
_memory->getNodeInfo(iter->first, odomPoseLocal, mapId, weight, label, stamp, groundTruth, velocity, gps, false);
|
EnvSensors sensors;
|
||||||
|
_memory->getNodeInfo(iter->first, odomPoseLocal, mapId, weight, label, stamp, groundTruth, velocity, gps, sensors, false);
|
||||||
signatures.insert(std::make_pair(iter->first,
|
signatures.insert(std::make_pair(iter->first,
|
||||||
Signature(iter->first,
|
Signature(iter->first,
|
||||||
mapId,
|
mapId,
|
||||||
@@ -2942,6 +2944,7 @@ bool Rtabmap::process(
|
|||||||
signatures.at(iter->first).setVelocity(velocity[0], velocity[1], velocity[2], velocity[3], velocity[4], velocity[5]);
|
signatures.at(iter->first).setVelocity(velocity[0], velocity[1], velocity[2], velocity[3], velocity[4], velocity[5]);
|
||||||
}
|
}
|
||||||
signatures.at(iter->first).sensorData().setGPS(gps);
|
signatures.at(iter->first).sensorData().setGPS(gps);
|
||||||
|
signatures.at(iter->first).sensorData().setEnvSensors(sensors);
|
||||||
if(_computeRMSE && !groundTruth.isNull())
|
if(_computeRMSE && !groundTruth.isNull())
|
||||||
{
|
{
|
||||||
groundTruths.insert(std::make_pair(iter->first, groundTruth));
|
groundTruths.insert(std::make_pair(iter->first, groundTruth));
|
||||||
@@ -3801,7 +3804,8 @@ void Rtabmap::get3DMap(
|
|||||||
Transform groundTruth;
|
Transform groundTruth;
|
||||||
std::vector<float> velocity;
|
std::vector<float> velocity;
|
||||||
GPS gps;
|
GPS gps;
|
||||||
_memory->getNodeInfo(*iter, odomPoseLocal, mapId, weight, label, stamp, groundTruth, velocity, gps, true);
|
EnvSensors sensors;
|
||||||
|
_memory->getNodeInfo(*iter, odomPoseLocal, mapId, weight, label, stamp, groundTruth, velocity, gps, sensors, true);
|
||||||
SensorData data = _memory->getNodeData(*iter);
|
SensorData data = _memory->getNodeData(*iter);
|
||||||
data.setId(*iter);
|
data.setId(*iter);
|
||||||
std::multimap<int, cv::KeyPoint> words;
|
std::multimap<int, cv::KeyPoint> words;
|
||||||
@@ -3825,6 +3829,7 @@ void Rtabmap::get3DMap(
|
|||||||
signatures.at(*iter).setVelocity(velocity[0], velocity[1], velocity[2], velocity[3], velocity[4], velocity[5]);
|
signatures.at(*iter).setVelocity(velocity[0], velocity[1], velocity[2], velocity[3], velocity[4], velocity[5]);
|
||||||
}
|
}
|
||||||
signatures.at(*iter).sensorData().setGPS(gps);
|
signatures.at(*iter).sensorData().setGPS(gps);
|
||||||
|
signatures.at(*iter).sensorData().setEnvSensors(sensors);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(_memory && (_memory->getStMem().size() || _memory->getWorkingMem().size() > 1))
|
else if(_memory && (_memory->getStMem().size() || _memory->getWorkingMem().size() > 1))
|
||||||
@@ -3879,7 +3884,8 @@ void Rtabmap::getGraph(
|
|||||||
Transform groundTruth;
|
Transform groundTruth;
|
||||||
std::vector<float> velocity;
|
std::vector<float> velocity;
|
||||||
GPS gps;
|
GPS gps;
|
||||||
_memory->getNodeInfo(iter->first, odomPoseLocal, mapId, weight, label, stamp, groundTruth, velocity, gps, global);
|
EnvSensors sensors;
|
||||||
|
_memory->getNodeInfo(iter->first, odomPoseLocal, mapId, weight, label, stamp, groundTruth, velocity, gps, sensors, global);
|
||||||
signatures->insert(std::make_pair(iter->first,
|
signatures->insert(std::make_pair(iter->first,
|
||||||
Signature(iter->first,
|
Signature(iter->first,
|
||||||
mapId,
|
mapId,
|
||||||
@@ -3908,6 +3914,7 @@ void Rtabmap::getGraph(
|
|||||||
signatures->at(iter->first).setVelocity(velocity[0], velocity[1], velocity[2], velocity[3], velocity[4], velocity[5]);
|
signatures->at(iter->first).setVelocity(velocity[0], velocity[1], velocity[2], velocity[3], velocity[4], velocity[5]);
|
||||||
}
|
}
|
||||||
signatures->at(iter->first).sensorData().setGPS(gps);
|
signatures->at(iter->first).sensorData().setGPS(gps);
|
||||||
|
signatures->at(iter->first).sensorData().setEnvSensors(sensors);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -632,7 +632,14 @@ void SensorData::uncompressData(
|
|||||||
_laserScanRaw = *laserScanRaw;
|
_laserScanRaw = *laserScanRaw;
|
||||||
if(_laserScanCompressed.format() == LaserScan::kUnknown)
|
if(_laserScanCompressed.format() == LaserScan::kUnknown)
|
||||||
{
|
{
|
||||||
_laserScanCompressed = LaserScan(_laserScanCompressed.data(), _laserScanCompressed.maxPoints(), _laserScanCompressed.maxRange(), _laserScanRaw.format(), _laserScanCompressed.localTransform());
|
if(_laserScanCompressed.angleIncrement() > 0.0f)
|
||||||
|
{
|
||||||
|
_laserScanCompressed = LaserScan(_laserScanCompressed.data(), _laserScanRaw.format(), _laserScanCompressed.rangeMin(), _laserScanCompressed.rangeMax(), _laserScanCompressed.angleMin(), _laserScanCompressed.angleMax(), _laserScanCompressed.angleIncrement(), _laserScanCompressed.localTransform());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_laserScanCompressed = LaserScan(_laserScanCompressed.data(), _laserScanCompressed.maxPoints(), _laserScanCompressed.rangeMax(), _laserScanRaw.format(), _laserScanCompressed.localTransform());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(userDataRaw && !userDataRaw->empty() && _userDataRaw.empty())
|
if(userDataRaw && !userDataRaw->empty() && _userDataRaw.empty())
|
||||||
@@ -780,8 +787,14 @@ void SensorData::uncompressDataConst(
|
|||||||
}
|
}
|
||||||
if(laserScanRaw && laserScanRaw->isEmpty())
|
if(laserScanRaw && laserScanRaw->isEmpty())
|
||||||
{
|
{
|
||||||
*laserScanRaw = LaserScan(ctLaserScan.getUncompressedData(), _laserScanCompressed.maxPoints(), _laserScanCompressed.maxRange(), _laserScanCompressed.format(), _laserScanCompressed.localTransform());
|
if(_laserScanCompressed.angleIncrement() > 0.0f)
|
||||||
|
{
|
||||||
|
*laserScanRaw = LaserScan(ctLaserScan.getUncompressedData(), _laserScanCompressed.format(), _laserScanCompressed.rangeMin(), _laserScanCompressed.rangeMax(), _laserScanCompressed.angleMin(), _laserScanCompressed.angleMax(), _laserScanCompressed.angleIncrement(), _laserScanCompressed.localTransform());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*laserScanRaw = LaserScan(ctLaserScan.getUncompressedData(), _laserScanCompressed.maxPoints(), _laserScanCompressed.rangeMax(), _laserScanCompressed.format(), _laserScanCompressed.localTransform());
|
||||||
|
}
|
||||||
if(laserScanRaw->isEmpty())
|
if(laserScanRaw->isEmpty())
|
||||||
{
|
{
|
||||||
if(_laserScanCompressed.isEmpty())
|
if(_laserScanCompressed.isEmpty())
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <rtabmap/core/StereoCameraModel.h>
|
#include <rtabmap/core/StereoCameraModel.h>
|
||||||
|
#include <rtabmap/core/Version.h>
|
||||||
#include <rtabmap/utilite/ULogger.h>
|
#include <rtabmap/utilite/ULogger.h>
|
||||||
#include <rtabmap/utilite/UDirectory.h>
|
#include <rtabmap/utilite/UDirectory.h>
|
||||||
#include <rtabmap/utilite/UFile.h>
|
#include <rtabmap/utilite/UFile.h>
|
||||||
@@ -358,6 +359,141 @@ bool StereoCameraModel::saveStereoTransform(const std::string & directory) const
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<unsigned char> StereoCameraModel::serialize() const
|
||||||
|
{
|
||||||
|
std::vector<unsigned char> leftData = left_.serialize();
|
||||||
|
std::vector<unsigned char> rightData = right_.serialize();
|
||||||
|
|
||||||
|
const int headerSize = 10;
|
||||||
|
int header[headerSize] = {
|
||||||
|
RTABMAP_VERSION_MAJOR, RTABMAP_VERSION_MINOR, RTABMAP_VERSION_PATCH, // 0,1,2
|
||||||
|
1, //stereo // 3
|
||||||
|
(int)R_.total(), (int)T_.total(), (int)E_.total(), (int)F_.total(), // 4,5,6,7
|
||||||
|
(int)leftData.size(), (int)rightData.size()}; // 8,9
|
||||||
|
UDEBUG("Header: %d %d %d %d %d %d %d %d %d %d", header[0],header[1],header[2],header[3],header[4],header[5],header[6],header[7],header[8],header[9]);
|
||||||
|
std::vector<unsigned char> data(
|
||||||
|
sizeof(int)*headerSize +
|
||||||
|
sizeof(double)*(R_.total()+T_.total()+E_.total()+F_.total()) +
|
||||||
|
leftData.size() + rightData.size());
|
||||||
|
memcpy(data.data(), header, sizeof(int)*headerSize);
|
||||||
|
int index = sizeof(int)*headerSize;
|
||||||
|
if(!R_.empty())
|
||||||
|
{
|
||||||
|
memcpy(data.data()+index, R_.data, sizeof(double)*(R_.total()));
|
||||||
|
index+=sizeof(double)*(R_.total());
|
||||||
|
}
|
||||||
|
if(!T_.empty())
|
||||||
|
{
|
||||||
|
memcpy(data.data()+index, T_.data, sizeof(double)*(T_.total()));
|
||||||
|
index+=sizeof(double)*(T_.total());
|
||||||
|
}
|
||||||
|
if(!E_.empty())
|
||||||
|
{
|
||||||
|
memcpy(data.data()+index, E_.data, sizeof(double)*(E_.total()));
|
||||||
|
index+=sizeof(double)*(E_.total());
|
||||||
|
}
|
||||||
|
if(!F_.empty())
|
||||||
|
{
|
||||||
|
memcpy(data.data()+index, F_.data, sizeof(double)*(F_.total()));
|
||||||
|
index+=sizeof(double)*(F_.total());
|
||||||
|
}
|
||||||
|
if(leftData.size())
|
||||||
|
{
|
||||||
|
memcpy(data.data()+index, leftData.data(), leftData.size());
|
||||||
|
index+=leftData.size();
|
||||||
|
}
|
||||||
|
if(rightData.size())
|
||||||
|
{
|
||||||
|
memcpy(data.data()+index, rightData.data(), rightData.size());
|
||||||
|
index+=rightData.size();
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int StereoCameraModel::deserialize(const std::vector<unsigned char>& data)
|
||||||
|
{
|
||||||
|
return deserialize(data.data(), data.size());
|
||||||
|
}
|
||||||
|
unsigned int StereoCameraModel::deserialize(const unsigned char * data, unsigned int dataSize)
|
||||||
|
{
|
||||||
|
*this = StereoCameraModel();
|
||||||
|
int headerSize = 10;
|
||||||
|
if(dataSize >= sizeof(int)*headerSize)
|
||||||
|
{
|
||||||
|
int iR = 4;
|
||||||
|
int iT = 5;
|
||||||
|
int iE = 6;
|
||||||
|
int iF = 7;
|
||||||
|
int iLeft = 8;
|
||||||
|
int iRight = 9;
|
||||||
|
const int * header = (const int *)data;
|
||||||
|
UDEBUG("Header: %d %d %d %d %d %d %d %d %d %d", header[0],header[1],header[2],header[3],header[4],header[5],header[6],header[7],header[8],header[9]);
|
||||||
|
int type = header[3];
|
||||||
|
if(type==1)
|
||||||
|
{
|
||||||
|
unsigned int requiredDataSize = sizeof(int)*headerSize +
|
||||||
|
sizeof(double)*(header[iR]+header[iT]+header[iE]+header[iF]) +
|
||||||
|
header[iLeft] + header[iRight];
|
||||||
|
UASSERT_MSG(dataSize >= requiredDataSize,
|
||||||
|
uFormat("dataSize=%d != required=%d (header: version %d.%d.%d type=%d R=%d T=%d E=%d F=%d Left=%d Right=%d)",
|
||||||
|
dataSize,
|
||||||
|
requiredDataSize,
|
||||||
|
header[0], header[1], header[2], header[3],
|
||||||
|
header[iR], header[iT], header[iE],header[iF], header[iLeft], header[iRight]).c_str());
|
||||||
|
|
||||||
|
unsigned int index = sizeof(int)*headerSize;
|
||||||
|
|
||||||
|
if(header[iR] != 0)
|
||||||
|
{
|
||||||
|
UASSERT(header[iR] == 9);
|
||||||
|
R_ = cv::Mat(3, 3, CV_64FC1, (void*)(data+index)).clone();
|
||||||
|
index+=sizeof(double)*(R_.total());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(header[iT] != 0)
|
||||||
|
{
|
||||||
|
UASSERT(header[iT] == 3);
|
||||||
|
T_ = cv::Mat(3, 1, CV_64FC1, (void*)(data+index)).clone();
|
||||||
|
index+=sizeof(double)*(T_.total());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(header[iE] != 0)
|
||||||
|
{
|
||||||
|
UASSERT(header[iE] == 9);
|
||||||
|
E_ = cv::Mat(3, 3, CV_64FC1, (void*)(data+index)).clone();
|
||||||
|
index+=sizeof(double)*(E_.total());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(header[iF] != 0)
|
||||||
|
{
|
||||||
|
UASSERT(header[iF] == 9);
|
||||||
|
F_ = cv::Mat(3, 3, CV_64FC1, (void*)(data+index)).clone();
|
||||||
|
index+=sizeof(double)*(F_.total());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(header[iLeft] != 0)
|
||||||
|
{
|
||||||
|
index += left_.deserialize((data+index), header[iLeft]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(header[iRight] != 0)
|
||||||
|
{
|
||||||
|
index += right_.deserialize((data+index), header[iRight]);
|
||||||
|
}
|
||||||
|
|
||||||
|
UASSERT(index <= dataSize);
|
||||||
|
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UERROR("Serialized calibration is not stereo (type=%d), use the appropriate class matching the type to deserialize.", type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
UERROR("Wrong serialized calibration data format detected (size in bytes=%d)! Cannot deserialize the data.", (int)dataSize);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void StereoCameraModel::scale(double scale)
|
void StereoCameraModel::scale(double scale)
|
||||||
{
|
{
|
||||||
left_ = left_.scaled(scale);
|
left_ = left_.scaled(scale);
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ CREATE TABLE Node (
|
|||||||
velocity BLOB, -- 6 float (vx,vy,vz,vroll,vpitch,vyaw) m/s and rad/s
|
velocity BLOB, -- 6 float (vx,vy,vz,vroll,vpitch,vyaw) m/s and rad/s
|
||||||
label TEXT,
|
label TEXT,
|
||||||
gps BLOB, -- 1x6 double: stamp, longitude (DD), latitude (DD), altitude (m), accuracy (m), bearing (North 0->360 deg clockwise)
|
gps BLOB, -- 1x6 double: stamp, longitude (DD), latitude (DD), altitude (m), accuracy (m), bearing (North 0->360 deg clockwise)
|
||||||
|
env_sensors BLOB, -- Variable 3xdouble: (sensorId1, value, stamp, sensorId2, value, stamp, ...)
|
||||||
time_enter DATE,
|
time_enter DATE,
|
||||||
PRIMARY KEY (id)
|
PRIMARY KEY (id)
|
||||||
);
|
);
|
||||||
@@ -87,6 +87,15 @@ CREATE TABLE Feature (
|
|||||||
FOREIGN KEY (node_id) REFERENCES Node(id)
|
FOREIGN KEY (node_id) REFERENCES Node(id)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
--
|
||||||
|
CREATE TABLE Tag (
|
||||||
|
node_id INTEGER NOT NULL,
|
||||||
|
tag_id INTEGER NOT NULL,
|
||||||
|
stamp FLOAT NOT NULL,
|
||||||
|
transform BLOB NOT NULL, -- 3x4 float, /base_link -> /tag_frame
|
||||||
|
FOREIGN KEY (node_id) REFERENCES Node(id)
|
||||||
|
);
|
||||||
|
|
||||||
CREATE TABLE Info (
|
CREATE TABLE Info (
|
||||||
STM_size INTEGER,
|
STM_size INTEGER,
|
||||||
last_sign_added INTEGER,
|
last_sign_added INTEGER,
|
||||||
|
|||||||
@@ -130,7 +130,27 @@ LaserScan commonFiltering(
|
|||||||
}
|
}
|
||||||
int previousSize = scan.size();
|
int previousSize = scan.size();
|
||||||
int scanMaxPtsTmp = scan.maxPoints();
|
int scanMaxPtsTmp = scan.maxPoints();
|
||||||
scan = LaserScan(cv::Mat(tmp, cv::Range::all(), cv::Range(0, oi)), scanMaxPtsTmp/downsamplingStep, rangeMax>0.0f&&rangeMax<scan.maxRange()?rangeMax:scan.maxRange(), scan.format(), scan.localTransform());
|
if(scan.angleIncrement() > 0.0f)
|
||||||
|
{
|
||||||
|
scan = LaserScan(
|
||||||
|
cv::Mat(tmp, cv::Range::all(), cv::Range(0, oi)),
|
||||||
|
scan.format(),
|
||||||
|
rangeMin>0.0f&&rangeMin>scan.rangeMin()?rangeMin:scan.rangeMin(),
|
||||||
|
rangeMax>0.0f&&rangeMax<scan.rangeMax()?rangeMax:scan.rangeMax(),
|
||||||
|
scan.angleMin(),
|
||||||
|
scan.angleMax(),
|
||||||
|
scan.angleIncrement() * (float)downsamplingStep,
|
||||||
|
scan.localTransform());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
scan = LaserScan(
|
||||||
|
cv::Mat(tmp, cv::Range::all(), cv::Range(0, oi)),
|
||||||
|
scanMaxPtsTmp/downsamplingStep,
|
||||||
|
rangeMax>0.0f&&rangeMax<scan.rangeMax()?rangeMax:scan.rangeMax(),
|
||||||
|
scan.format(),
|
||||||
|
scan.localTransform());
|
||||||
|
}
|
||||||
UDEBUG("Downsampling scan (step=%d): %d -> %d (scanMaxPts=%d->%d)", downsamplingStep, previousSize, scan.size(), scanMaxPtsTmp, scan.maxPoints());
|
UDEBUG("Downsampling scan (step=%d): %d -> %d (scanMaxPts=%d->%d)", downsamplingStep, previousSize, scan.size(), scanMaxPtsTmp, scan.maxPoints());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -154,16 +174,16 @@ LaserScan commonFiltering(
|
|||||||
if(cloud->size() && (normalK > 0 || normalRadius>0.0f))
|
if(cloud->size() && (normalK > 0 || normalRadius>0.0f))
|
||||||
{
|
{
|
||||||
pcl::PointCloud<pcl::Normal>::Ptr normals = util3d::computeNormals(cloud, normalK, normalRadius);
|
pcl::PointCloud<pcl::Normal>::Ptr normals = util3d::computeNormals(cloud, normalK, normalRadius);
|
||||||
scan = LaserScan(laserScanFromPointCloud(*cloud, *normals), scanMaxPts, scan.maxRange(), LaserScan::kXYZRGBNormal, scan.localTransform());
|
scan = LaserScan(laserScanFromPointCloud(*cloud, *normals), scanMaxPts, scan.rangeMax(), LaserScan::kXYZRGBNormal, scan.localTransform());
|
||||||
UDEBUG("Normals computed (k=%d radius=%f)", normalK, normalRadius);
|
UDEBUG("Normals computed (k=%d radius=%f)", normalK, normalRadius);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(scan.hasNormals())
|
if(scan.hasNormals())
|
||||||
{
|
{
|
||||||
UWARN("Voxel filter i applied, but normal parameters are not set and input scan has normals. The returned scan has no normals.");
|
UWARN("Voxel filter is applied, but normal parameters are not set and input scan has normals. The returned scan has no normals.");
|
||||||
}
|
}
|
||||||
scan = LaserScan(laserScanFromPointCloud(*cloud), scanMaxPts, scan.maxRange(), LaserScan::kXYZRGB, scan.localTransform());
|
scan = LaserScan(laserScanFromPointCloud(*cloud), scanMaxPts, scan.rangeMax(), LaserScan::kXYZRGB, scan.localTransform());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -186,12 +206,19 @@ LaserScan commonFiltering(
|
|||||||
if(scan.is2d())
|
if(scan.is2d())
|
||||||
{
|
{
|
||||||
normals = util3d::computeNormals2D(cloud, normalK, normalRadius);
|
normals = util3d::computeNormals2D(cloud, normalK, normalRadius);
|
||||||
scan = LaserScan(laserScan2dFromPointCloud(*cloud, *normals), scanMaxPts, scan.maxRange(), LaserScan::kXYINormal, scan.localTransform());
|
if(voxelSize == 0.0f && scan.angleIncrement() > 0.0f)
|
||||||
|
{
|
||||||
|
scan = LaserScan(laserScan2dFromPointCloud(*cloud, *normals), LaserScan::kXYINormal, scan.rangeMin(), scan.rangeMax(), scan.angleMin(), scan.angleMax(), scan.angleIncrement(), scan.localTransform());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
scan = LaserScan(laserScan2dFromPointCloud(*cloud, *normals), scanMaxPts, scan.rangeMax(), LaserScan::kXYINormal, scan.localTransform());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
normals = util3d::computeNormals(cloud, normalK, normalRadius);
|
normals = util3d::computeNormals(cloud, normalK, normalRadius);
|
||||||
scan = LaserScan(laserScanFromPointCloud(*cloud, *normals), scanMaxPts, scan.maxRange(), LaserScan::kXYZINormal, scan.localTransform());
|
scan = LaserScan(laserScanFromPointCloud(*cloud, *normals), scanMaxPts, scan.rangeMax(), LaserScan::kXYZINormal, scan.localTransform());
|
||||||
}
|
}
|
||||||
UDEBUG("Normals computed (k=%d radius=%f)", normalK, normalRadius);
|
UDEBUG("Normals computed (k=%d radius=%f)", normalK, normalRadius);
|
||||||
}
|
}
|
||||||
@@ -203,11 +230,11 @@ LaserScan commonFiltering(
|
|||||||
}
|
}
|
||||||
if(scan.is2d())
|
if(scan.is2d())
|
||||||
{
|
{
|
||||||
scan = LaserScan(laserScan2dFromPointCloud(*cloud), scanMaxPts, scan.maxRange(), LaserScan::kXYI, scan.localTransform());
|
scan = LaserScan(laserScan2dFromPointCloud(*cloud), scanMaxPts, scan.rangeMax(), LaserScan::kXYI, scan.localTransform());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
scan = LaserScan(laserScanFromPointCloud(*cloud), scanMaxPts, scan.maxRange(), LaserScan::kXYZI, scan.localTransform());
|
scan = LaserScan(laserScanFromPointCloud(*cloud), scanMaxPts, scan.rangeMax(), LaserScan::kXYZI, scan.localTransform());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -231,12 +258,19 @@ LaserScan commonFiltering(
|
|||||||
if(scan.is2d())
|
if(scan.is2d())
|
||||||
{
|
{
|
||||||
normals = util3d::computeNormals2D(cloud, normalK, normalRadius);
|
normals = util3d::computeNormals2D(cloud, normalK, normalRadius);
|
||||||
scan = LaserScan(laserScan2dFromPointCloud(*cloud, *normals), scanMaxPts, scan.maxRange(), LaserScan::kXYNormal, scan.localTransform());
|
if(voxelSize == 0.0f && scan.angleIncrement() > 0.0f)
|
||||||
|
{
|
||||||
|
scan = LaserScan(laserScan2dFromPointCloud(*cloud, *normals), LaserScan::kXYNormal, scan.rangeMin(), scan.rangeMax(), scan.angleMin(), scan.angleMax(), scan.angleIncrement(), scan.localTransform());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
scan = LaserScan(laserScan2dFromPointCloud(*cloud, *normals), scanMaxPts, scan.rangeMax(), LaserScan::kXYNormal, scan.localTransform());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
normals = util3d::computeNormals(cloud, normalK, normalRadius);
|
normals = util3d::computeNormals(cloud, normalK, normalRadius);
|
||||||
scan = LaserScan(laserScanFromPointCloud(*cloud, *normals), scanMaxPts, scan.maxRange(), LaserScan::kXYZNormal, scan.localTransform());
|
scan = LaserScan(laserScanFromPointCloud(*cloud, *normals), scanMaxPts, scan.rangeMax(), LaserScan::kXYZNormal, scan.localTransform());
|
||||||
}
|
}
|
||||||
UDEBUG("Normals computed (k=%d radius=%f)", normalK, normalRadius);
|
UDEBUG("Normals computed (k=%d radius=%f)", normalK, normalRadius);
|
||||||
}
|
}
|
||||||
@@ -248,11 +282,11 @@ LaserScan commonFiltering(
|
|||||||
}
|
}
|
||||||
if(scan.is2d())
|
if(scan.is2d())
|
||||||
{
|
{
|
||||||
scan = LaserScan(laserScan2dFromPointCloud(*cloud), scanMaxPts, scan.maxRange(), LaserScan::kXY, scan.localTransform());
|
scan = LaserScan(laserScan2dFromPointCloud(*cloud), scanMaxPts, scan.rangeMax(), LaserScan::kXY, scan.localTransform());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
scan = LaserScan(laserScanFromPointCloud(*cloud), scanMaxPts, scan.maxRange(), LaserScan::kXYZ, scan.localTransform());
|
scan = LaserScan(laserScanFromPointCloud(*cloud), scanMaxPts, scan.rangeMax(), LaserScan::kXYZ, scan.localTransform());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -307,7 +341,11 @@ LaserScan rangeFiltering(
|
|||||||
cv::Mat(scan.data(), cv::Range::all(), cv::Range(i,i+1)).copyTo(cv::Mat(output, cv::Range::all(), cv::Range(oi,oi+1)));
|
cv::Mat(scan.data(), cv::Range::all(), cv::Range(i,i+1)).copyTo(cv::Mat(output, cv::Range::all(), cv::Range(oi,oi+1)));
|
||||||
++oi;
|
++oi;
|
||||||
}
|
}
|
||||||
return LaserScan(cv::Mat(output, cv::Range::all(), cv::Range(0, oi)), scan.maxPoints(), scan.maxRange(), scan.format(), scan.localTransform());
|
if(scan.angleIncrement() > 0.0f)
|
||||||
|
{
|
||||||
|
return LaserScan(cv::Mat(output, cv::Range::all(), cv::Range(0, oi)), scan.format(), scan.rangeMin(), scan.rangeMax(), scan.angleMin(), scan.angleMax(), scan.angleIncrement(), scan.localTransform());
|
||||||
|
}
|
||||||
|
return LaserScan(cv::Mat(output, cv::Range::all(), cv::Range(0, oi)), scan.maxPoints(), scan.rangeMax(), scan.format(), scan.localTransform());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -334,7 +372,11 @@ LaserScan downsample(
|
|||||||
cv::Mat(scan.data(), cv::Range::all(), cv::Range(i,i+1)).copyTo(cv::Mat(output, cv::Range::all(), cv::Range(oi,oi+1)));
|
cv::Mat(scan.data(), cv::Range::all(), cv::Range(i,i+1)).copyTo(cv::Mat(output, cv::Range::all(), cv::Range(oi,oi+1)));
|
||||||
++oi;
|
++oi;
|
||||||
}
|
}
|
||||||
return LaserScan(output, scan.maxPoints()/step, scan.maxRange(), scan.format(), scan.localTransform());
|
if(scan.angleIncrement() > 0.0f)
|
||||||
|
{
|
||||||
|
return LaserScan(output, scan.format(), scan.rangeMin(), scan.rangeMax(), scan.angleMin(), scan.angleMax(), scan.angleIncrement()*step, scan.localTransform());
|
||||||
|
}
|
||||||
|
return LaserScan(output, scan.maxPoints()/step, scan.rangeMax(), scan.format(), scan.localTransform());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
template<typename PointT>
|
template<typename PointT>
|
||||||
|
|||||||
@@ -2148,7 +2148,7 @@ LaserScan computeNormals(
|
|||||||
{
|
{
|
||||||
UASSERT(!laserScan.is2d());
|
UASSERT(!laserScan.is2d());
|
||||||
pcl::PointCloud<pcl::Normal>::Ptr normals = util3d::computeNormals(cloud, searchK, searchRadius);
|
pcl::PointCloud<pcl::Normal>::Ptr normals = util3d::computeNormals(cloud, searchK, searchRadius);
|
||||||
return LaserScan(laserScanFromPointCloud(*cloud, *normals), laserScan.maxPoints(), laserScan.maxRange(), LaserScan::kXYZRGBNormal, laserScan.localTransform());
|
return LaserScan(laserScanFromPointCloud(*cloud, *normals), laserScan.maxPoints(), laserScan.rangeMax(), LaserScan::kXYZRGBNormal, laserScan.localTransform());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(laserScan.hasIntensity())
|
else if(laserScan.hasIntensity())
|
||||||
@@ -2159,12 +2159,20 @@ LaserScan computeNormals(
|
|||||||
if(laserScan.is2d())
|
if(laserScan.is2d())
|
||||||
{
|
{
|
||||||
pcl::PointCloud<pcl::Normal>::Ptr normals = util3d::computeNormals2D(cloud, searchK, searchRadius);
|
pcl::PointCloud<pcl::Normal>::Ptr normals = util3d::computeNormals2D(cloud, searchK, searchRadius);
|
||||||
return LaserScan(laserScan2dFromPointCloud(*cloud, *normals), laserScan.maxPoints(), laserScan.maxRange(), LaserScan::kXYZRGBNormal, laserScan.localTransform());
|
if(laserScan.angleIncrement() > 0.0f)
|
||||||
|
{
|
||||||
|
return LaserScan(laserScan2dFromPointCloud(*cloud, *normals), LaserScan::kXYINormal, laserScan.rangeMin(), laserScan.rangeMax(), laserScan.angleMin(), laserScan.angleMax(), laserScan.angleIncrement(), laserScan.localTransform());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return LaserScan(laserScan2dFromPointCloud(*cloud, *normals), laserScan.maxPoints(), laserScan.rangeMax(), LaserScan::kXYINormal, laserScan.localTransform());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pcl::PointCloud<pcl::Normal>::Ptr normals = util3d::computeNormals(cloud, searchK, searchRadius);
|
pcl::PointCloud<pcl::Normal>::Ptr normals = util3d::computeNormals(cloud, searchK, searchRadius);
|
||||||
return LaserScan(laserScanFromPointCloud(*cloud, *normals), laserScan.maxPoints(), laserScan.maxRange(), LaserScan::kXYZRGBNormal, laserScan.localTransform());
|
return LaserScan(laserScanFromPointCloud(*cloud, *normals), laserScan.maxPoints(), laserScan.rangeMax(), LaserScan::kXYZINormal, laserScan.localTransform());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2176,12 +2184,19 @@ LaserScan computeNormals(
|
|||||||
if(laserScan.is2d())
|
if(laserScan.is2d())
|
||||||
{
|
{
|
||||||
pcl::PointCloud<pcl::Normal>::Ptr normals = util3d::computeNormals2D(cloud, searchK, searchRadius);
|
pcl::PointCloud<pcl::Normal>::Ptr normals = util3d::computeNormals2D(cloud, searchK, searchRadius);
|
||||||
return LaserScan(laserScan2dFromPointCloud(*cloud, *normals), laserScan.maxPoints(), laserScan.maxRange(), LaserScan::kXYZRGBNormal, laserScan.localTransform());
|
if(laserScan.angleIncrement() > 0.0f)
|
||||||
|
{
|
||||||
|
return LaserScan(laserScan2dFromPointCloud(*cloud, *normals), LaserScan::kXYNormal, laserScan.rangeMin(), laserScan.rangeMax(), laserScan.angleMin(), laserScan.angleMax(), laserScan.angleIncrement(), laserScan.localTransform());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return LaserScan(laserScan2dFromPointCloud(*cloud, *normals), laserScan.maxPoints(), laserScan.rangeMax(), LaserScan::kXYNormal, laserScan.localTransform());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pcl::PointCloud<pcl::Normal>::Ptr normals = util3d::computeNormals(cloud, searchK, searchRadius);
|
pcl::PointCloud<pcl::Normal>::Ptr normals = util3d::computeNormals(cloud, searchK, searchRadius);
|
||||||
return LaserScan(laserScanFromPointCloud(*cloud, *normals), laserScan.maxPoints(), laserScan.maxRange(), LaserScan::kXYZRGBNormal, laserScan.localTransform());
|
return LaserScan(laserScanFromPointCloud(*cloud, *normals), laserScan.maxPoints(), laserScan.rangeMax(), LaserScan::kXYZNormal, laserScan.localTransform());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2854,7 +2869,14 @@ LaserScan adjustNormalsToViewPoint(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return LaserScan(output, scan.maxPoints(), scan.maxRange(), scan.format(), scan.localTransform());
|
if(scan.angleIncrement() > 0.0f)
|
||||||
|
{
|
||||||
|
return LaserScan(output, scan.format(), scan.rangeMin(), scan.rangeMax(), scan.angleMin(), scan.angleMax(), scan.angleIncrement(), scan.localTransform());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return LaserScan(output, scan.maxPoints(), scan.rangeMax(), scan.format(), scan.localTransform());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return scan;
|
return scan;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ LaserScan transformLaserScan(const LaserScan & laserScan, const Transform & tran
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return LaserScan(output, laserScan.maxPoints(), laserScan.maxRange(), laserScan.format(), laserScan.localTransform());
|
return LaserScan(output, laserScan.maxPoints(), laserScan.rangeMax(), laserScan.format(), laserScan.localTransform());
|
||||||
}
|
}
|
||||||
|
|
||||||
pcl::PointCloud<pcl::PointXYZ>::Ptr transformPointCloud(
|
pcl::PointCloud<pcl::PointXYZ>::Ptr transformPointCloud(
|
||||||
|
|||||||
@@ -157,8 +157,10 @@ private:
|
|||||||
QLabel * labelMapId,
|
QLabel * labelMapId,
|
||||||
QLabel * labelPose,
|
QLabel * labelPose,
|
||||||
QLabel * labelVelocity,
|
QLabel * labelVelocity,
|
||||||
QLabel * labeCalib,
|
QLabel * labelCalib,
|
||||||
|
QLabel * labelScan,
|
||||||
QLabel * labelGps,
|
QLabel * labelGps,
|
||||||
|
QLabel * labelSensors,
|
||||||
bool updateConstraintView);
|
bool updateConstraintView);
|
||||||
void updateStereo(const SensorData * data);
|
void updateStereo(const SensorData * data);
|
||||||
void updateWordsMatching();
|
void updateWordsMatching();
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include <QtCore/QMap>
|
#include <QtCore/QMap>
|
||||||
#include <QtCore/QSettings>
|
#include <QtCore/QSettings>
|
||||||
#include <rtabmap/core/Link.h>
|
#include <rtabmap/core/Link.h>
|
||||||
#include <rtabmap/core/GeodeticCoords.h>
|
#include <rtabmap/core/GPS.h>
|
||||||
#include <opencv2/opencv.hpp>
|
#include <opencv2/opencv.hpp>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|||||||
@@ -1178,6 +1178,7 @@ void DatabaseViewer::exportDatabase()
|
|||||||
std::map<int, double> stamps;
|
std::map<int, double> stamps;
|
||||||
std::map<int, Transform> groundTruths;
|
std::map<int, Transform> groundTruths;
|
||||||
std::map<int, GPS> gpsValues;
|
std::map<int, GPS> gpsValues;
|
||||||
|
std::map<int, EnvSensors> sensorsValues;
|
||||||
for(int i=0; i<ids_.size(); i+=1+framesIgnored)
|
for(int i=0; i<ids_.size(); i+=1+framesIgnored)
|
||||||
{
|
{
|
||||||
Transform odomPose, groundTruth;
|
Transform odomPose, groundTruth;
|
||||||
@@ -1187,7 +1188,8 @@ void DatabaseViewer::exportDatabase()
|
|||||||
double stamp = 0;
|
double stamp = 0;
|
||||||
std::vector<float> velocity;
|
std::vector<float> velocity;
|
||||||
GPS gps;
|
GPS gps;
|
||||||
if(dbDriver_->getNodeInfo(ids_[i], odomPose, mapId, weight, label, stamp, groundTruth, velocity, gps))
|
EnvSensors sensors;
|
||||||
|
if(dbDriver_->getNodeInfo(ids_[i], odomPose, mapId, weight, label, stamp, groundTruth, velocity, gps, sensors))
|
||||||
{
|
{
|
||||||
if(frameRate == 0 ||
|
if(frameRate == 0 ||
|
||||||
previousStamp == 0 ||
|
previousStamp == 0 ||
|
||||||
@@ -1211,6 +1213,10 @@ void DatabaseViewer::exportDatabase()
|
|||||||
{
|
{
|
||||||
gpsValues.insert(std::make_pair(ids_[i], gps));
|
gpsValues.insert(std::make_pair(ids_[i], gps));
|
||||||
}
|
}
|
||||||
|
if(sensors.size())
|
||||||
|
{
|
||||||
|
sensorsValues.insert(std::make_pair(ids_[i], sensors));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(sessionExported >= 0 && mapId > sessionExported)
|
if(sessionExported >= 0 && mapId > sessionExported)
|
||||||
@@ -1289,6 +1295,10 @@ void DatabaseViewer::exportDatabase()
|
|||||||
{
|
{
|
||||||
sensorData.setGPS(gpsValues.at(id));
|
sensorData.setGPS(gpsValues.at(id));
|
||||||
}
|
}
|
||||||
|
if(sensorsValues.find(id)!=sensorsValues.end())
|
||||||
|
{
|
||||||
|
sensorData.setEnvSensors(sensorsValues.at(id));
|
||||||
|
}
|
||||||
|
|
||||||
recorder.addData(sensorData, dialog.isOdomExported()?poses.at(id):Transform(), covariance);
|
recorder.addData(sensorData, dialog.isOdomExported()?poses.at(id):Transform(), covariance);
|
||||||
|
|
||||||
@@ -1527,7 +1537,8 @@ void DatabaseViewer::updateIds()
|
|||||||
int mapId;
|
int mapId;
|
||||||
std::vector<float> v;
|
std::vector<float> v;
|
||||||
GPS gps;
|
GPS gps;
|
||||||
dbDriver_->getNodeInfo(ids_[i], p, mapId, w, l, s, g, v, gps);
|
EnvSensors sensors;
|
||||||
|
dbDriver_->getNodeInfo(ids_[i], p, mapId, w, l, s, g, v, gps, sensors);
|
||||||
mapIds_.insert(std::make_pair(ids_[i], mapId));
|
mapIds_.insert(std::make_pair(ids_[i], mapId));
|
||||||
weights_.insert(std::make_pair(ids_[i], w));
|
weights_.insert(std::make_pair(ids_[i], w));
|
||||||
if(wmStates.find(ids_[i]) != wmStates.end())
|
if(wmStates.find(ids_[i]) != wmStates.end())
|
||||||
@@ -2059,7 +2070,8 @@ void DatabaseViewer::exportPoses(int format)
|
|||||||
int mapId;
|
int mapId;
|
||||||
std::vector<float> v;
|
std::vector<float> v;
|
||||||
GPS gps;
|
GPS gps;
|
||||||
dbDriver_->getNodeInfo(iter->first, p, mapId, w, l, stamp, g, v, gps);
|
EnvSensors sensors;
|
||||||
|
dbDriver_->getNodeInfo(iter->first, p, mapId, w, l, stamp, g, v, gps, sensors);
|
||||||
values.insert(std::make_pair(iter->first, GPS(stamp, coord.longitude(), coord.latitude(), coord.altitude(), 0, 0)));
|
values.insert(std::make_pair(iter->first, GPS(stamp, coord.longitude(), coord.latitude(), coord.altitude(), 0, 0)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2265,7 +2277,8 @@ void DatabaseViewer::exportPoses(int format)
|
|||||||
int mapId;
|
int mapId;
|
||||||
std::vector<float> v;
|
std::vector<float> v;
|
||||||
GPS gps;
|
GPS gps;
|
||||||
if(dbDriver_->getNodeInfo(iter->first, p, mapId, w, l, stamp, g, v, gps))
|
EnvSensors sensors;
|
||||||
|
if(dbDriver_->getNodeInfo(iter->first, p, mapId, w, l, stamp, g, v, gps, sensors))
|
||||||
{
|
{
|
||||||
stamps.insert(std::make_pair(iter->first, stamp));
|
stamps.insert(std::make_pair(iter->first, stamp));
|
||||||
}
|
}
|
||||||
@@ -2886,7 +2899,8 @@ void DatabaseViewer::regenerateLocalMaps()
|
|||||||
QString msg;
|
QString msg;
|
||||||
std::vector<float> velocity;
|
std::vector<float> velocity;
|
||||||
GPS gps;
|
GPS gps;
|
||||||
if(dbDriver_->getNodeInfo(data.id(), odomPose, mapId, weight, label, stamp, groundTruth, velocity, gps))
|
EnvSensors sensors;
|
||||||
|
if(dbDriver_->getNodeInfo(data.id(), odomPose, mapId, weight, label, stamp, groundTruth, velocity, gps, sensors))
|
||||||
{
|
{
|
||||||
Signature s = data;
|
Signature s = data;
|
||||||
s.setPose(odomPose);
|
s.setPose(odomPose);
|
||||||
@@ -3009,7 +3023,8 @@ void DatabaseViewer::regenerateCurrentLocalMaps()
|
|||||||
QString msg;
|
QString msg;
|
||||||
std::vector<float> velocity;
|
std::vector<float> velocity;
|
||||||
GPS gps;
|
GPS gps;
|
||||||
if(dbDriver_->getNodeInfo(data.id(), odomPose, mapId, weight, label, stamp, groundTruth, velocity, gps))
|
EnvSensors sensors;
|
||||||
|
if(dbDriver_->getNodeInfo(data.id(), odomPose, mapId, weight, label, stamp, groundTruth, velocity, gps, sensors))
|
||||||
{
|
{
|
||||||
Signature s = data;
|
Signature s = data;
|
||||||
s.setPose(odomPose);
|
s.setPose(odomPose);
|
||||||
@@ -3444,7 +3459,9 @@ void DatabaseViewer::sliderAValueChanged(int value)
|
|||||||
ui_->label_poseA,
|
ui_->label_poseA,
|
||||||
ui_->label_velA,
|
ui_->label_velA,
|
||||||
ui_->label_calibA,
|
ui_->label_calibA,
|
||||||
|
ui_->label_scanA,
|
||||||
ui_->label_gpsA,
|
ui_->label_gpsA,
|
||||||
|
ui_->label_sensorsA,
|
||||||
true);
|
true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3463,7 +3480,9 @@ void DatabaseViewer::sliderBValueChanged(int value)
|
|||||||
ui_->label_poseB,
|
ui_->label_poseB,
|
||||||
ui_->label_velB,
|
ui_->label_velB,
|
||||||
ui_->label_calibB,
|
ui_->label_calibB,
|
||||||
|
ui_->label_scanB,
|
||||||
ui_->label_gpsB,
|
ui_->label_gpsB,
|
||||||
|
ui_->label_sensorsB,
|
||||||
true);
|
true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3480,7 +3499,9 @@ void DatabaseViewer::update(int value,
|
|||||||
QLabel * labelPose,
|
QLabel * labelPose,
|
||||||
QLabel * labelVelocity,
|
QLabel * labelVelocity,
|
||||||
QLabel * labelCalib,
|
QLabel * labelCalib,
|
||||||
|
QLabel * labelScan,
|
||||||
QLabel * labelGps,
|
QLabel * labelGps,
|
||||||
|
QLabel * labelSensors,
|
||||||
bool updateConstraintView)
|
bool updateConstraintView)
|
||||||
{
|
{
|
||||||
UTimer timer;
|
UTimer timer;
|
||||||
@@ -3494,7 +3515,9 @@ void DatabaseViewer::update(int value,
|
|||||||
labelVelocity->clear();
|
labelVelocity->clear();
|
||||||
stamp->clear();
|
stamp->clear();
|
||||||
labelCalib->clear();
|
labelCalib->clear();
|
||||||
|
labelScan ->clear();
|
||||||
labelGps->clear();
|
labelGps->clear();
|
||||||
|
labelSensors->clear();
|
||||||
QRectF rect;
|
QRectF rect;
|
||||||
if(value >= 0 && value < ids_.size())
|
if(value >= 0 && value < ids_.size())
|
||||||
{
|
{
|
||||||
@@ -3545,7 +3568,8 @@ void DatabaseViewer::update(int value,
|
|||||||
double s;
|
double s;
|
||||||
std::vector<float> v;
|
std::vector<float> v;
|
||||||
GPS gps;
|
GPS gps;
|
||||||
dbDriver_->getNodeInfo(id, odomPose, mapId, w, l, s, g, v, gps);
|
EnvSensors sensors;
|
||||||
|
dbDriver_->getNodeInfo(id, odomPose, mapId, w, l, s, g, v, gps, sensors);
|
||||||
|
|
||||||
weight->setNum(w);
|
weight->setNum(w);
|
||||||
label->setText(l.c_str());
|
label->setText(l.c_str());
|
||||||
@@ -3566,8 +3590,56 @@ void DatabaseViewer::update(int value,
|
|||||||
labelGps->setText(QString("stamp=%1 longitude=%2 latitude=%3 altitude=%4m error=%5m bearing=%6deg").arg(QString::number(gps.stamp(), 'f')).arg(gps.longitude()).arg(gps.latitude()).arg(gps.altitude()).arg(gps.error()).arg(gps.bearing()));
|
labelGps->setText(QString("stamp=%1 longitude=%2 latitude=%3 altitude=%4m error=%5m bearing=%6deg").arg(QString::number(gps.stamp(), 'f')).arg(gps.longitude()).arg(gps.latitude()).arg(gps.altitude()).arg(gps.error()).arg(gps.bearing()));
|
||||||
labelGps->setToolTip(QDateTime::fromMSecsSinceEpoch(gps.stamp()*1000.0).toString("dd.MM.yyyy hh:mm:ss.zzz"));
|
labelGps->setToolTip(QDateTime::fromMSecsSinceEpoch(gps.stamp()*1000.0).toString("dd.MM.yyyy hh:mm:ss.zzz"));
|
||||||
}
|
}
|
||||||
|
if(sensors.size())
|
||||||
|
{
|
||||||
|
QString sensorsStr;
|
||||||
|
QString tooltipStr;
|
||||||
|
for(EnvSensors::iterator iter=sensors.begin(); iter!=sensors.end(); ++iter)
|
||||||
|
{
|
||||||
|
if(iter != sensors.begin())
|
||||||
|
{
|
||||||
|
sensorsStr += " | ";
|
||||||
|
tooltipStr += " | ";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(iter->first == EnvSensor::kWifiSignalStrength)
|
||||||
|
{
|
||||||
|
sensorsStr += uFormat("%.1f dbm", iter->second.value()).c_str();
|
||||||
|
tooltipStr += "Wifi signal strength";
|
||||||
|
}
|
||||||
|
else if(iter->first == EnvSensor::kAmbientTemperature)
|
||||||
|
{
|
||||||
|
sensorsStr += uFormat("%.1f \u00B0C", iter->second.value()).c_str();
|
||||||
|
tooltipStr += "Ambient Temperature";
|
||||||
|
}
|
||||||
|
else if(iter->first == EnvSensor::kAmbientAirPressure)
|
||||||
|
{
|
||||||
|
sensorsStr += uFormat("%.1f hPa", iter->second.value()).c_str();
|
||||||
|
tooltipStr += "Ambient Air Pressure";
|
||||||
|
}
|
||||||
|
else if(iter->first == EnvSensor::kAmbientLight)
|
||||||
|
{
|
||||||
|
sensorsStr += uFormat("%.0f lx", iter->second.value()).c_str();
|
||||||
|
tooltipStr += "Ambient Light";
|
||||||
|
}
|
||||||
|
else if(iter->first == EnvSensor::kAmbientRelativeHumidity)
|
||||||
|
{
|
||||||
|
sensorsStr += uFormat("%.0f %%", iter->second.value()).c_str();
|
||||||
|
tooltipStr += "Ambient Relative Humidity";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sensorsStr += uFormat("%.2f", iter->second.value()).c_str();
|
||||||
|
tooltipStr += QString("Type %1").arg((int)iter->first);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
labelSensors->setText(sensorsStr);
|
||||||
|
labelSensors->setToolTip(tooltipStr);
|
||||||
|
}
|
||||||
if(data.cameraModels().size() || data.stereoCameraModel().isValidForProjection())
|
if(data.cameraModels().size() || data.stereoCameraModel().isValidForProjection())
|
||||||
{
|
{
|
||||||
|
std::stringstream calibrationDetails;
|
||||||
if(data.cameraModels().size())
|
if(data.cameraModels().size())
|
||||||
{
|
{
|
||||||
if(!data.depthRaw().empty() && data.depthRaw().cols!=data.imageRaw().cols && data.imageRaw().cols)
|
if(!data.depthRaw().empty() && data.depthRaw().cols!=data.imageRaw().cols && data.imageRaw().cols)
|
||||||
@@ -3596,6 +3668,17 @@ void DatabaseViewer::update(int value,
|
|||||||
.arg(data.cameraModels()[0].cy())
|
.arg(data.cameraModels()[0].cy())
|
||||||
.arg(data.cameraModels()[0].localTransform().prettyPrint().c_str()));
|
.arg(data.cameraModels()[0].localTransform().prettyPrint().c_str()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for(unsigned int i=0; i<data.cameraModels().size();++i)
|
||||||
|
{
|
||||||
|
if(i!=0) calibrationDetails << std::endl;
|
||||||
|
calibrationDetails << "Id: " << i << " Size=" << data.cameraModels()[i].imageWidth() << "x" << data.cameraModels()[i].imageWidth() << std::endl;
|
||||||
|
if( data.cameraModels()[i].K_raw().total()) calibrationDetails << "K=" << data.cameraModels()[i].K_raw() << std::endl;
|
||||||
|
if( data.cameraModels()[i].D_raw().total()) calibrationDetails << "D=" << data.cameraModels()[i].D_raw() << std::endl;
|
||||||
|
if( data.cameraModels()[i].R().total()) calibrationDetails << "R=" << data.cameraModels()[i].R() << std::endl;
|
||||||
|
if( data.cameraModels()[i].P().total()) calibrationDetails << "P=" << data.cameraModels()[i].P() << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -3609,7 +3692,25 @@ void DatabaseViewer::update(int value,
|
|||||||
.arg(data.stereoCameraModel().left().cy())
|
.arg(data.stereoCameraModel().left().cy())
|
||||||
.arg(data.stereoCameraModel().baseline())
|
.arg(data.stereoCameraModel().baseline())
|
||||||
.arg(data.stereoCameraModel().localTransform().prettyPrint().c_str()));
|
.arg(data.stereoCameraModel().localTransform().prettyPrint().c_str()));
|
||||||
|
|
||||||
|
calibrationDetails << "Left:" << " Size=" << data.stereoCameraModel().left().imageWidth() << "x" << data.stereoCameraModel().left().imageWidth() << std::endl;
|
||||||
|
if( data.stereoCameraModel().left().K_raw().total()) calibrationDetails << "K=" << data.stereoCameraModel().left().K_raw() << std::endl;
|
||||||
|
if( data.stereoCameraModel().left().D_raw().total()) calibrationDetails << "D=" << data.stereoCameraModel().left().D_raw() << std::endl;
|
||||||
|
if( data.stereoCameraModel().left().R().total()) calibrationDetails << "R=" << data.stereoCameraModel().left().R() << std::endl;
|
||||||
|
if( data.stereoCameraModel().left().P().total()) calibrationDetails << "P=" << data.stereoCameraModel().left().P() << std::endl;
|
||||||
|
calibrationDetails << std::endl;
|
||||||
|
calibrationDetails << "Right:" << " Size=" << data.stereoCameraModel().right().imageWidth() << "x" << data.stereoCameraModel().right().imageWidth() << std::endl;
|
||||||
|
if( data.stereoCameraModel().right().K_raw().total()) calibrationDetails << "K=" << data.stereoCameraModel().right().K_raw() << std::endl;
|
||||||
|
if( data.stereoCameraModel().right().D_raw().total()) calibrationDetails << "D=" << data.stereoCameraModel().right().D_raw() << std::endl;
|
||||||
|
if( data.stereoCameraModel().right().R().total()) calibrationDetails << "R=" << data.stereoCameraModel().right().R() << std::endl;
|
||||||
|
if( data.stereoCameraModel().right().P().total()) calibrationDetails << "P=" << data.stereoCameraModel().right().P() << std::endl;
|
||||||
|
calibrationDetails << std::endl;
|
||||||
|
if( data.stereoCameraModel().R().total()) calibrationDetails << "R=" << data.stereoCameraModel().R() << std::endl;
|
||||||
|
if( data.stereoCameraModel().T().total()) calibrationDetails << "T=" << data.stereoCameraModel().T() << std::endl;
|
||||||
|
if( data.stereoCameraModel().F().total()) calibrationDetails << "F=" << data.stereoCameraModel().F() << std::endl;
|
||||||
|
if( data.stereoCameraModel().E().total()) calibrationDetails << "E=" << data.stereoCameraModel().E() << std::endl;
|
||||||
}
|
}
|
||||||
|
labelCalib->setToolTip(calibrationDetails.str().c_str());
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -3617,6 +3718,23 @@ void DatabaseViewer::update(int value,
|
|||||||
labelCalib->setText("NA");
|
labelCalib->setText("NA");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(data.laserScanRaw().size())
|
||||||
|
{
|
||||||
|
labelScan->setText(tr("Format=%1 Points=%2 [max=%3] Range=[%4->%5 m] Angle=[%6->%7 rad inc=%8] Has [Color=%9 2D=%10 Normals=%11 Intensity=%12]")
|
||||||
|
.arg(data.laserScanRaw().format())
|
||||||
|
.arg(data.laserScanRaw().size())
|
||||||
|
.arg(data.laserScanRaw().maxPoints())
|
||||||
|
.arg(data.laserScanRaw().rangeMin())
|
||||||
|
.arg(data.laserScanRaw().rangeMax())
|
||||||
|
.arg(data.laserScanRaw().angleMin())
|
||||||
|
.arg(data.laserScanRaw().angleMax())
|
||||||
|
.arg(data.laserScanRaw().angleIncrement())
|
||||||
|
.arg(data.laserScanRaw().hasRGB()?1:0)
|
||||||
|
.arg(data.laserScanRaw().is2d()?1:0)
|
||||||
|
.arg(data.laserScanRaw().hasNormals()?1:0)
|
||||||
|
.arg(data.laserScanRaw().hasIntensity()?1:0));
|
||||||
|
}
|
||||||
|
|
||||||
//stereo
|
//stereo
|
||||||
if(!data.depthOrRightRaw().empty() && data.depthOrRightRaw().type() == CV_8UC1)
|
if(!data.depthOrRightRaw().empty() && data.depthOrRightRaw().type() == CV_8UC1)
|
||||||
{
|
{
|
||||||
@@ -4576,7 +4694,9 @@ void DatabaseViewer::updateConstraintView(
|
|||||||
ui_->label_poseA,
|
ui_->label_poseA,
|
||||||
ui_->label_velA,
|
ui_->label_velA,
|
||||||
ui_->label_calibA,
|
ui_->label_calibA,
|
||||||
|
ui_->label_scanA,
|
||||||
ui_->label_gpsA,
|
ui_->label_gpsA,
|
||||||
|
ui_->label_sensorsA,
|
||||||
false); // don't update constraints view!
|
false); // don't update constraints view!
|
||||||
this->update(idToIndex_.value(link.to()),
|
this->update(idToIndex_.value(link.to()),
|
||||||
ui_->label_indexB,
|
ui_->label_indexB,
|
||||||
@@ -4591,7 +4711,9 @@ void DatabaseViewer::updateConstraintView(
|
|||||||
ui_->label_poseB,
|
ui_->label_poseB,
|
||||||
ui_->label_velB,
|
ui_->label_velB,
|
||||||
ui_->label_calibB,
|
ui_->label_calibB,
|
||||||
|
ui_->label_scanB,
|
||||||
ui_->label_gpsB,
|
ui_->label_gpsB,
|
||||||
|
ui_->label_sensorsB,
|
||||||
false); // don't update constraints view!
|
false); // don't update constraints view!
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4633,7 +4755,8 @@ void DatabaseViewer::updateConstraintView(
|
|||||||
Transform p,g;
|
Transform p,g;
|
||||||
std::vector<float> v;
|
std::vector<float> v;
|
||||||
GPS gps;
|
GPS gps;
|
||||||
dbDriver_->getNodeInfo(link.from(), p, m, w, l, s, g, v, gps);
|
EnvSensors sensors;
|
||||||
|
dbDriver_->getNodeInfo(link.from(), p, m, w, l, s, g, v, gps, sensors);
|
||||||
if(!p.isNull())
|
if(!p.isNull())
|
||||||
{
|
{
|
||||||
// keep just the z and roll/pitch rotation
|
// keep just the z and roll/pitch rotation
|
||||||
@@ -6054,7 +6177,7 @@ void DatabaseViewer::refineConstraint(int from, int to, bool silent)
|
|||||||
assembledData.setLaserScanRaw(LaserScan(
|
assembledData.setLaserScanRaw(LaserScan(
|
||||||
assembledScan,
|
assembledScan,
|
||||||
fromScan.maxPoints()?fromScan.maxPoints():maxPoints,
|
fromScan.maxPoints()?fromScan.maxPoints():maxPoints,
|
||||||
fromScan.maxRange(),
|
fromScan.rangeMax(),
|
||||||
fromScan.format(),
|
fromScan.format(),
|
||||||
fromScan.is2d()?Transform(0,0,fromScan.localTransform().z(),0,0,0):Transform::getIdentity()));
|
fromScan.is2d()?Transform(0,0,fromScan.localTransform().z(),0,0,0):Transform::getIdentity()));
|
||||||
|
|
||||||
|
|||||||
@@ -2575,7 +2575,8 @@ bool ExportCloudsDialog::getExportedClouds(
|
|||||||
std::string l;
|
std::string l;
|
||||||
double s;
|
double s;
|
||||||
GPS gps;
|
GPS gps;
|
||||||
_dbDriver->getNodeInfo(jter->first, p, m, w, l, s, gt, velocity, gps);
|
EnvSensors sensors;
|
||||||
|
_dbDriver->getNodeInfo(jter->first, p, m, w, l, s, gt, velocity, gps, sensors);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cv::Size imageSize = img.size();
|
cv::Size imageSize = img.size();
|
||||||
@@ -2608,7 +2609,8 @@ bool ExportCloudsDialog::getExportedClouds(
|
|||||||
std::string l;
|
std::string l;
|
||||||
double s;
|
double s;
|
||||||
GPS gps;
|
GPS gps;
|
||||||
_dbDriver->getNodeInfo(jter->first, p, m, w, l, s, gt, velocity, gps);
|
EnvSensors sensors;
|
||||||
|
_dbDriver->getNodeInfo(jter->first, p, m, w, l, s, gt, velocity, gps, sensors);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+11
-11
@@ -2004,7 +2004,7 @@ void MainWindow::processStats(const rtabmap::Statistics & stat)
|
|||||||
LaserScan(
|
LaserScan(
|
||||||
cv::Mat(),
|
cv::Mat(),
|
||||||
signature.sensorData().laserScanRaw().maxPoints(),
|
signature.sensorData().laserScanRaw().maxPoints(),
|
||||||
signature.sensorData().laserScanRaw().maxRange(),
|
signature.sensorData().laserScanRaw().rangeMax(),
|
||||||
signature.sensorData().laserScanRaw().format(),
|
signature.sensorData().laserScanRaw().format(),
|
||||||
signature.sensorData().laserScanRaw().localTransform()));
|
signature.sensorData().laserScanRaw().localTransform()));
|
||||||
s.sensorData().clearOccupancyGridRaw();
|
s.sensorData().clearOccupancyGridRaw();
|
||||||
@@ -3359,7 +3359,7 @@ void MainWindow::createAndAddScanToMap(int nodeId, const Transform & pose, int m
|
|||||||
added = _cloudViewer->addCloud(scanName, cloudRGBWithNormals, pose, color);
|
added = _cloudViewer->addCloud(scanName, cloudRGBWithNormals, pose, color);
|
||||||
if(added && nodeId > 0)
|
if(added && nodeId > 0)
|
||||||
{
|
{
|
||||||
scan = LaserScan(util3d::laserScanFromPointCloud(*cloudRGBWithNormals, scan.localTransform().inverse()), scan.maxPoints(), scan.maxRange(), LaserScan::kXYZRGBNormal, scan.localTransform());
|
scan = LaserScan(util3d::laserScanFromPointCloud(*cloudRGBWithNormals, scan.localTransform().inverse()), scan.maxPoints(), scan.rangeMax(), LaserScan::kXYZRGBNormal, scan.localTransform());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(cloudIWithNormals.get())
|
else if(cloudIWithNormals.get())
|
||||||
@@ -3369,11 +3369,11 @@ void MainWindow::createAndAddScanToMap(int nodeId, const Transform & pose, int m
|
|||||||
{
|
{
|
||||||
if(scan.is2d())
|
if(scan.is2d())
|
||||||
{
|
{
|
||||||
scan = LaserScan(util3d::laserScan2dFromPointCloud(*cloudIWithNormals, scan.localTransform().inverse()), scan.maxPoints(), scan.maxRange(), LaserScan::kXYINormal, scan.localTransform());
|
scan = LaserScan(util3d::laserScan2dFromPointCloud(*cloudIWithNormals, scan.localTransform().inverse()), scan.maxPoints(), scan.rangeMax(), LaserScan::kXYINormal, scan.localTransform());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
scan = LaserScan(util3d::laserScanFromPointCloud(*cloudIWithNormals, scan.localTransform().inverse()), scan.maxPoints(), scan.maxRange(), LaserScan::kXYZINormal, scan.localTransform());
|
scan = LaserScan(util3d::laserScanFromPointCloud(*cloudIWithNormals, scan.localTransform().inverse()), scan.maxPoints(), scan.rangeMax(), LaserScan::kXYZINormal, scan.localTransform());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3384,11 +3384,11 @@ void MainWindow::createAndAddScanToMap(int nodeId, const Transform & pose, int m
|
|||||||
{
|
{
|
||||||
if(scan.is2d())
|
if(scan.is2d())
|
||||||
{
|
{
|
||||||
scan = LaserScan(util3d::laserScan2dFromPointCloud(*cloudWithNormals, scan.localTransform().inverse()), scan.maxPoints(), scan.maxRange(), LaserScan::kXYNormal, scan.localTransform());
|
scan = LaserScan(util3d::laserScan2dFromPointCloud(*cloudWithNormals, scan.localTransform().inverse()), scan.maxPoints(), scan.rangeMax(), LaserScan::kXYNormal, scan.localTransform());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
scan = LaserScan(util3d::laserScanFromPointCloud(*cloudWithNormals, scan.localTransform().inverse()), scan.maxPoints(), scan.maxRange(), LaserScan::kXYZNormal, scan.localTransform());
|
scan = LaserScan(util3d::laserScanFromPointCloud(*cloudWithNormals, scan.localTransform().inverse()), scan.maxPoints(), scan.rangeMax(), LaserScan::kXYZNormal, scan.localTransform());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3397,7 +3397,7 @@ void MainWindow::createAndAddScanToMap(int nodeId, const Transform & pose, int m
|
|||||||
added = _cloudViewer->addCloud(scanName, cloudRGB, pose, color);
|
added = _cloudViewer->addCloud(scanName, cloudRGB, pose, color);
|
||||||
if(added && nodeId > 0)
|
if(added && nodeId > 0)
|
||||||
{
|
{
|
||||||
scan = LaserScan(util3d::laserScanFromPointCloud(*cloudRGB, scan.localTransform().inverse()), scan.maxPoints(), scan.maxRange(), LaserScan::kXYZRGB, scan.localTransform());
|
scan = LaserScan(util3d::laserScanFromPointCloud(*cloudRGB, scan.localTransform().inverse()), scan.maxPoints(), scan.rangeMax(), LaserScan::kXYZRGB, scan.localTransform());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(cloudI.get())
|
else if(cloudI.get())
|
||||||
@@ -3407,11 +3407,11 @@ void MainWindow::createAndAddScanToMap(int nodeId, const Transform & pose, int m
|
|||||||
{
|
{
|
||||||
if(scan.is2d())
|
if(scan.is2d())
|
||||||
{
|
{
|
||||||
scan = LaserScan(util3d::laserScan2dFromPointCloud(*cloudI, scan.localTransform().inverse()), scan.maxPoints(), scan.maxRange(), LaserScan::kXYI, scan.localTransform());
|
scan = LaserScan(util3d::laserScan2dFromPointCloud(*cloudI, scan.localTransform().inverse()), scan.maxPoints(), scan.rangeMax(), LaserScan::kXYI, scan.localTransform());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
scan = LaserScan(util3d::laserScanFromPointCloud(*cloudI, scan.localTransform().inverse()), scan.maxPoints(), scan.maxRange(), LaserScan::kXYZI, scan.localTransform());
|
scan = LaserScan(util3d::laserScanFromPointCloud(*cloudI, scan.localTransform().inverse()), scan.maxPoints(), scan.rangeMax(), LaserScan::kXYZI, scan.localTransform());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3423,11 +3423,11 @@ void MainWindow::createAndAddScanToMap(int nodeId, const Transform & pose, int m
|
|||||||
{
|
{
|
||||||
if(scan.is2d())
|
if(scan.is2d())
|
||||||
{
|
{
|
||||||
scan = LaserScan(util3d::laserScan2dFromPointCloud(*cloud, scan.localTransform().inverse()), scan.maxPoints(), scan.maxRange(), LaserScan::kXY, scan.localTransform());
|
scan = LaserScan(util3d::laserScan2dFromPointCloud(*cloud, scan.localTransform().inverse()), scan.maxPoints(), scan.rangeMax(), LaserScan::kXY, scan.localTransform());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
scan = LaserScan(util3d::laserScanFromPointCloud(*cloud, scan.localTransform().inverse()), scan.maxPoints(), scan.maxRange(), LaserScan::kXYZ, scan.localTransform());
|
scan = LaserScan(util3d::laserScanFromPointCloud(*cloud, scan.localTransform().inverse()), scan.maxPoints(), scan.rangeMax(), LaserScan::kXYZ, scan.localTransform());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,8 +61,8 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>301</width>
|
<width>287</width>
|
||||||
<height>242</height>
|
<height>288</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout" columnstretch="0,1">
|
<layout class="QGridLayout" name="gridLayout" columnstretch="0,1">
|
||||||
@@ -202,14 +202,14 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="9" column="0">
|
<item row="10" column="0">
|
||||||
<widget class="QLabel" name="label_childrenA_16">
|
<widget class="QLabel" name="label_childrenA_16">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>GPS</string>
|
<string>GPS</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="9" column="1">
|
<item row="10" column="1">
|
||||||
<widget class="QLabel" name="label_gpsA">
|
<widget class="QLabel" name="label_gpsA">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
@@ -236,6 +236,40 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="11" column="0">
|
||||||
|
<widget class="QLabel" name="label_childrenA_20">
|
||||||
|
<property name="text">
|
||||||
|
<string>Sensors</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="11" column="1">
|
||||||
|
<widget class="QLabel" name="label_sensorsA">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="9" column="0">
|
||||||
|
<widget class="QLabel" name="label_childrenA_22">
|
||||||
|
<property name="text">
|
||||||
|
<string>Scan</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="9" column="1">
|
||||||
|
<widget class="QLabel" name="label_scanA">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
@@ -253,8 +287,8 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>301</width>
|
<width>287</width>
|
||||||
<height>242</height>
|
<height>288</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout_2" columnstretch="0,1">
|
<layout class="QGridLayout" name="gridLayout_2" columnstretch="0,1">
|
||||||
@@ -302,14 +336,14 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="9" column="0">
|
<item row="10" column="0">
|
||||||
<widget class="QLabel" name="label_childrenA_17">
|
<widget class="QLabel" name="label_childrenA_17">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>GPS</string>
|
<string>GPS</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="9" column="1">
|
<item row="10" column="1">
|
||||||
<widget class="QLabel" name="label_gpsB">
|
<widget class="QLabel" name="label_gpsB">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
@@ -428,6 +462,40 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="11" column="0">
|
||||||
|
<widget class="QLabel" name="label_childrenA_21">
|
||||||
|
<property name="text">
|
||||||
|
<string>Sensors</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="11" column="1">
|
||||||
|
<widget class="QLabel" name="label_sensorsB">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="9" column="0">
|
||||||
|
<widget class="QLabel" name="label_childrenA_23">
|
||||||
|
<property name="text">
|
||||||
|
<string>Scan</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="9" column="1">
|
||||||
|
<widget class="QLabel" name="label_scanB">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
<package>
|
<package>
|
||||||
<name>rtabmap</name>
|
<name>rtabmap</name>
|
||||||
<version>0.17.7</version>
|
<version>0.18.0</version>
|
||||||
<description>RTAB-Map's standalone library. RTAB-Map is a RGB-D SLAM approach with real-time constraints.</description>
|
<description>RTAB-Map's standalone library. RTAB-Map is a RGB-D SLAM approach with real-time constraints.</description>
|
||||||
<maintainer email="[email protected]">Mathieu Labbe</maintainer>
|
<maintainer email="[email protected]">Mathieu Labbe</maintainer>
|
||||||
<author>Mathieu Labbe</author>
|
<author>Mathieu Labbe</author>
|
||||||
|
|||||||
@@ -607,7 +607,8 @@ int main(int argc, char * argv[])
|
|||||||
double s;
|
double s;
|
||||||
std::vector<float> v;
|
std::vector<float> v;
|
||||||
GPS gps;
|
GPS gps;
|
||||||
rtabmap.getMemory()->getNodeInfo(iter->first, o, m, w, l, s, gtPose, v, gps, true);
|
EnvSensors sensors;
|
||||||
|
rtabmap.getMemory()->getNodeInfo(iter->first, o, m, w, l, s, gtPose, v, gps, sensors, true);
|
||||||
if(!gtPose.isNull())
|
if(!gtPose.isNull())
|
||||||
{
|
{
|
||||||
groundTruth.insert(std::make_pair(iter->first, gtPose));
|
groundTruth.insert(std::make_pair(iter->first, gtPose));
|
||||||
|
|||||||
@@ -589,7 +589,8 @@ int main(int argc, char * argv[])
|
|||||||
double s;
|
double s;
|
||||||
std::vector<float> v;
|
std::vector<float> v;
|
||||||
GPS gps;
|
GPS gps;
|
||||||
rtabmap.getMemory()->getNodeInfo(iter->first, o, m, w, l, s, gtPose, v, gps, true);
|
EnvSensors sensors;
|
||||||
|
rtabmap.getMemory()->getNodeInfo(iter->first, o, m, w, l, s, gtPose, v, gps, sensors, true);
|
||||||
if(!gtPose.isNull())
|
if(!gtPose.isNull())
|
||||||
{
|
{
|
||||||
groundTruth.insert(std::make_pair(iter->first, gtPose));
|
groundTruth.insert(std::make_pair(iter->first, gtPose));
|
||||||
|
|||||||
@@ -202,7 +202,8 @@ int main(int argc, char * argv[])
|
|||||||
std::string l;
|
std::string l;
|
||||||
double s;
|
double s;
|
||||||
std::vector<float> v;
|
std::vector<float> v;
|
||||||
if(driver->getNodeInfo(*iter, p, m, w, l, s, gt, v, gps))
|
EnvSensors sensors;
|
||||||
|
if(driver->getNodeInfo(*iter, p, m, w, l, s, gt, v, gps, sensors))
|
||||||
{
|
{
|
||||||
odomPoses.insert(std::make_pair(*iter, p));
|
odomPoses.insert(std::make_pair(*iter, p));
|
||||||
if(!gt.isNull())
|
if(!gt.isNull())
|
||||||
|
|||||||
@@ -395,7 +395,8 @@ int main(int argc, char * argv[])
|
|||||||
double s;
|
double s;
|
||||||
std::vector<float> v;
|
std::vector<float> v;
|
||||||
GPS gps;
|
GPS gps;
|
||||||
rtabmap.getMemory()->getNodeInfo(iter->first, o, m, w, l, s, gtPose, v, gps, true);
|
EnvSensors sensors;
|
||||||
|
rtabmap.getMemory()->getNodeInfo(iter->first, o, m, w, l, s, gtPose, v, gps, sensors, true);
|
||||||
if(!gtPose.isNull())
|
if(!gtPose.isNull())
|
||||||
{
|
{
|
||||||
groundTruth.insert(std::make_pair(iter->first, gtPose));
|
groundTruth.insert(std::make_pair(iter->first, gtPose));
|
||||||
|
|||||||
Reference in New Issue
Block a user