LpSensor Library Documentation

The LpSensor library has been discontinued. Please use OpenZEN instead.

Overview

The LpSensor library contains classes that allow a user to integrate LPMS devices into their own applications. Library binaries for Windows Visual Studio are released together with our (deprecated) OpenMAT software package. Please download OpenMAT directly from the LP-Research website.

Compiling applications that use the LpSensor library requires the following components:

Header files (usually in C:/OpenMAT/include)

LpmsSensorManagerI.h - Contains the interface for the LpmsSensorManager class.

LpmsSensorI.h - Contains the interface for the LpmsSensor class

ImuData.h - Structure for containing output data from a LPMS device

LpmsDefinitions.h Macro definitions for accessing LPMS

DeviceListItem.h - Contains the class definition for an element of a LPMS device list

LIB files (usually in C:/OpenMAT/lib/x86)

LpSensorD.lib - LpSensor library (Debug version)

LpSensor.lib - LpSensor library (Release version)

DLL files (usually in C:/OpenMAT/lib/x86)

LpSensorD.dll - LpSensor library (Debug version)

LpSensor.dll - LpSensor library (Release version)

PCANBasic.dll - PeakCAN library DLL for CAN interface communication (optional).

ftd2xx.dll - The FTDI library to communicate with an LPMS over USB.

To compile the application please do the following:

  1. Include LpmsSensorManagerI.h.

  2. Add LpSensor.lib (or LpSensorD.lib if you are compiling in debug mode) to the link libraries file list of your application

  3. Make sure that you set a path to LpSensor.dll / LpSensorD.dll, PCANBasic.dll (optional) and ftd2xx.dll so that the runtime file of your application can access them.

  4. Build your application.

Important Classes

SensorManager

The sensor manager class wraps a number of LpmsSensor instances into one class, handles device discovery and device polling. For user applications the following methods are most commonly used. Please refer to the interface file SensorManagerI.h for more information.

NOTE: An instance of LpmsSensor is returned by the static function LpmsSensorManagerFactory(). See the example listing in the next section for more information how to initialize a LpmsSensorManager object.

NOTE: LpSensor automatically applies calibration parameters to raw sensor data and therefore records and outputs calibrated sensor data.

Method name

SensorManager(void)

Parameters

none

Returns

SensorManager object

Description

Constructor of a SensorManager object.

Method name

LpSensor* addSensor(int mode, string deviceId)

Parameters

[ TO-DO ]

Returns

Pointer to LpSensor object.

Description

Adds a sensor device to the list of devices adminstered by the SensorManager object.

Method name

void removeSensor(LpSensor *sensor)

Parameters

[ TO-DO ]

Returns

none

Description

Removes a device from the list of currently administered sensors.

Method name

void listDevices(std::vector<DeviceListItem> *v)

Parameters

[ TO-DO ]

Returns

None

Description

Lists all connected LPMS devices. The device discovery runs in a seperate thread.For Bluetooth devices should take several seconds to be added to the devicelist. CAN bus and USB devices should be added after around 1s.

LpmsSensor

This is a class to access the specific functions and parameters of an LPMS. The most commonly used methods are listed below. Please refer to the interface file LpmSensorI.h for more information.

NOTE: The following units are used by LpmsSensor for measured and processed sensor data:

Data type

Units

Angular velocity (gyroscope)

rad/s

Acceleration (accelerometer)

g

Magnetic field strength (magnetometer)

uT

Euler angle

radians

Linear acceleration

g

Quaternion

normalized units

Barometric pressure

mPa

Altitude

M

Temperature

°C

Method name

void run(void)

Parameters

None

Returns

None

Description

Starts the data acquisition procedure.

Method name

void pause(void)

Parameters

None

Returns

None

Description

Pauses the data acquisition procedure.

Method name

int getSensorStatus(void)

Parameters

None

Returns

Sensor state identifier:

Description

Retrieves the current sensor status.

Method name

int getConnectionStatus(void)

Parameters

None

Returns

Connection status identifier:

Description

Retrieves the current connection status.

Method name

void startResetReference(void)

Parameters

None

Returns

None

Description

Resets the current accelerometer and magnetometer reference. Please see the ‘Operation’ chapter for details on the reference vector adjustment procedure.

Method name

void startCalibrateGyro(void)

Parameters

None

Returns

None

Description

Starts the calibration of the sensor gyroscope.

Method name

void startMagCalibration(void)

Parameters

None

Returns

None

Description

Starts the calibration of the LPMS magnetometer.

Method name

CalibrationData* getConfigurationData(void)

Parameters

None

Returns

Pointer to CalibrationData object.

Description

Retrieves the CalibrationData structure containing theconfigurationparameters ofthe connected LPMS.

Method name

bool setConfigurationPrm(int parameterIndex, int parameter)

Parameters

Supported parameterIndex identifiers:

Supported parameter identifiers for each parameter index:

PRM_OPENMAT_ID

Integer ID number between 1 and 255.

PRM_FILTER_MODE

PRM_PARAMETER_SET

PRM_GYR_THRESHOLD_ENABLE

PRM_GYR_RANGE

PRM_ACC_RANGE

PRM_MAG_RANGE

Returns

None

Description

Sets a configuration parameter.

Method name

bool getConfigurationPrm(int parameterIndex, int *parameter)

Parameters

See setConfigurationPrm method for an explanation of supported paramer indices and parameters.

Returns

None

Description

Retrieves a configuration parameter.

Method name

void resetOrientation(void)

Parameters

None

Returns

None

Description

Resets the orientation offset of the sensor.

Method name

void saveCalibrationData(void)

Parameters

None

Returns

None

Description

Starts saving the current parameter settings to the sensor flash memory.

Method name

virtual void getCalibratedSensorData(float g[3], float a[3], float b[3])

Parameters

[ TO-DO ]

Returns

None

Description

Retrieves calibrated sensor data (gyroscope, accelerometer, magnetometer).

Method name

virtual void getQuaternion(float q[4])

Parameters

[ TO-DO ]

Returns

None

Description

Retrieves the 3d orientation quaternion.

Method name

virtual void getEulerAngle(float r[3])

Parameters

[ TO-DO ]

Returns

None

Description

Retrieves the currently measured 3d Euler angles.

Method name

virtual void getRotationMatrix(float M[3][3])

Parameters

[ TO-DO ]

Returns

None

Description

Retrievs the current rotation matrix.

Example Code (C++)

Connecting to the an LPMS device

#include "stdio.h" #include "LpmsSensorI.h" #include "LpmsSensorManagerI.h" int main(int argc, char *argv[]) { ImuData d; // Gets a LpmsSensorManager instance LpmsSensorManagerI* manager = LpmsSensorManagerFactory(); // Connects to LPMS-B sensor with address 00:11:22:33:44:55 LpmsSensorI* lpms = manager->addSensor(DEVICE_LPMS_B, "00:11:22:33:44:55"); while(1) { // Checks, if connected if (lpms->getConnectionStatus() == SENSOR_CONNECTION_CONNECTED) { // Reads quaternion data d = lpms->getCurrentData(); // Shows data printf("Timestamp=%f, qW=%f, qX=%f, qY=%f, qZ=%f\n", d.timeStamp, d.q[0], d.q[1], d.q[2], d.q[3]); } } // Removes the initialized sensor manager->removeSensor(lpms); // Deletes LpmsSensorManager object delete manager; return 0; }

Setting and Retrieval of Sensor Parameters

/* Setting a sensor parameter. */ lpmsDevice->setParameter(PRM_ACC_RANGE, LPMS_ACC_RANGE_8G); /* Retrieving a sensor parameter. */ lpmsDevice->setParameter(PRM_ACC_RANGE, &p); Sensor and Connection Status Inquiry /* Retrieves current sensor status */ int status = getSensorStatus(); switch (status) { case SENSOR_STATUS_RUNNING: std::cout << "Sensor is running." << std::endl; break; case SENSOR_STATUS_PAUSED: std::cout << "Sensor is paused." << std::endl; break; } status = lpmsDevice->getConnectionStatus(); switch (status) { case SENSOR_CONNECTION_CONNECTING: std::cout << "Sensor is currently connecting." << std::endl; break; case SENSOR_CONNECTION_CONNECTED: std::cout << "Sensor is connected." << std::endl; break; }

Common Angle Conversion Routines

Conversion Quaternion to Matrix

typedef struct _LpVector3f { float data[3]; } LpVector3f; typedef struct _LpVector4f { float data[4]; } LpVector4f; typedef struct _LpMatrix3x3f { float data[3][3]; } LpMatrix3x3f; void quaternionToMatrix(LpVector4f *q, LpMatrix3x3f* M) { float tmp1; float tmp2; float sqw = q->data[0] * q->data[0]; float sqx = q->data[1] * q->data[1]; float sqy = q->data[2] * q->data[2]; float sqz = q->data[3] * q->data[3]; float invs = 1 / (sqx + sqy + sqz + sqw); M->data[0][0] = ( sqx - sqy - sqz + sqw) * invs; M->data[1][1] = (-sqx + sqy - sqz + sqw) * invs; M->data[2][2] = (-sqx - sqy + sqz + sqw) * invs; tmp1 = q->data[1] * q->data[2]; tmp2 = q->data[3] * q->data[0]; M->data[1][0] = 2.0f * (tmp1 + tmp2) * invs; M->data[0][1] = 2.0f * (tmp1 - tmp2) * invs; tmp1 = q->data[1] * q->data[3]; tmp2 = q->data[2] * q->data[0]; M->data[2][0] = 2.0f * (tmp1 - tmp2) * invs; M->data[0][2] = 2.0f * (tmp1 + tmp2) * invs; tmp1 = q->data[2] * q->data[3]; tmp2 = q->data[1] * q->data[0]; M->data[2][1] = 2.0f * (tmp1 + tmp2) * invs; M->data[1][2] = 2.0f * (tmp1 - tmp2) * invs; }

Conversion Quaternion to Euler Angles (ZYX rotation sequence)