Program Listing for File sensor-types.h

Return to documentation for file (map-structure/sensors/include/sensors/sensor-types.h)

  #ifndef SENSORS_SENSOR_TYPES_H_
#define SENSORS_SENSOR_TYPES_H_

#include <string>

#include <aslam/common/sensor.h>

namespace vi_map {

// Warning: Ordering of sensor is important in that the first sensors in the
// enum have to be the aslam sensors and only afterwards can the other maplab
// sensors be added (due to how the integer assignment works)
enum SensorType : uint8_t {
  kUnknown = aslam::SensorType::kUnknown,
  kNCamera = aslam::SensorType::kNCamera,
  kCamera = aslam::SensorType::kCamera,
  kImu,
  kLoopClosureSensor,
  kGpsWgs,
  kGpsUtm,
  kLidar,
  kOdometry6DoF,
  kAbsolute6DoF,
  kWheelOdometry,
  kPointCloudMapSensor,
  kInvalid  // this must be the last one
};

constexpr const char* kNCameraIdentifier = aslam::kNCameraIdentifier;
constexpr const char* kCameraIdentifier = aslam::kCameraIdentifier;
constexpr const char* kImuIdentifier = "IMU";
constexpr const char* kGpsUtmIdentifier = "GPS_UTM";
constexpr const char* kGpsWgsIdentifier = "GPS_WGS";
constexpr const char* kLidarIdentifier = "LIDAR";
constexpr const char* kOdometry6DoFIdentifier = "ODOMETRY_6DOF";
constexpr const char* kLoopClosureSensorIdentifier = "LOOP_CLOSURE";
constexpr const char* kAbsolute6DoFIdentifier = "ABSOLUTE_6DOF";
constexpr const char* kWheelOdometryIdentifier = "WHEEL_ODOMETRY";
constexpr const char* kPointCloudMapSensorIdentifier = "POINTCLOUD_MAP";

// Check if an integer is a valid sensor type. Function argument is an int to
// avoid having to cast to SensorType before passing the argument, since for
// integers not in the enum this has undefined behavior
inline bool isValidSensorType(uint8_t sensor_type) {
  return sensor_type > kUnknown && sensor_type < kInvalid;
}

inline SensorType convertStringToSensorType(const std::string& sensor_string) {
  const char* sensor_c_string = sensor_string.c_str();
  std::function<bool(const char*, const char*)> equals = [](const char* lhs,
                                                            const char* rhs) {
    return std::strcmp(lhs, rhs) == 0;
  };

  if (equals(sensor_c_string, kNCameraIdentifier)) {
    return SensorType::kNCamera;
  } else if (equals(sensor_c_string, kCameraIdentifier)) {
    return SensorType::kCamera;
  } else if (equals(sensor_c_string, kImuIdentifier)) {
    return SensorType::kImu;
  } else if (equals(sensor_c_string, kLoopClosureSensorIdentifier)) {
    return SensorType::kLoopClosureSensor;
  } else if (equals(sensor_c_string, kGpsUtmIdentifier)) {
    return SensorType::kGpsWgs;
  } else if (equals(sensor_c_string, kGpsWgsIdentifier)) {
    return SensorType::kGpsUtm;
  } else if (equals(sensor_c_string, kLidarIdentifier)) {
    return SensorType::kLidar;
  } else if (equals(sensor_c_string, kOdometry6DoFIdentifier)) {
    return SensorType::kOdometry6DoF;
  } else if (equals(sensor_c_string, kAbsolute6DoFIdentifier)) {
    return SensorType::kAbsolute6DoF;
  } else if (equals(sensor_c_string, kWheelOdometryIdentifier)) {
    return SensorType::kWheelOdometry;
  } else if (equals(sensor_c_string, kPointCloudMapSensorIdentifier)) {
    return SensorType::kPointCloudMapSensor;
  } else {
    LOG(ERROR) << "Unable to parse sensor type string: '" << sensor_string
               << "' to a sensor type!";
    return SensorType::kUnknown;
  }
}

}  // namespace vi_map

#endif  // SENSORS_SENSOR_TYPES_H_