OpenHPS/openhps-imu

View on GitHub
src/nodes/processing/AccelerationProcessingNode.ts

Summary

Maintainability
B
4 hrs
Test Coverage
import {
    Accelerometer,
    DataFrame,
    DataObject,
    FilterProcessingNode,
    LinearAccelerationSensor,
    LinearVelocity,
    LinearVelocitySensor,
} from '@openhps/core';

/**
 * Acceleration processing to linear velocity
 * @category Processing node
 */
export class AccelerationProcessingNode extends FilterProcessingNode<DataFrame> {
    public initFilter(object: DataObject, frame: DataFrame): Promise<any> {
        return new Promise<any>((resolve, reject) => {
            if (!frame.getSensor(Accelerometer) && !frame.getSensor(LinearAccelerationSensor)) {
                return reject(new Error(`Acceleration processing requires accelerometer readings!`));
            }

            resolve({
                alpha: 0,
                beta: 0,
                gamma: 0,
            });
        });
    }

    public filter(object: DataObject, frame: DataFrame): Promise<DataObject> {
        return new Promise<DataObject>((resolve) => {
            const accl = frame.getSensor(LinearAccelerationSensor) || frame.getSensor(Accelerometer);
            const dt = 1000 / accl.frequency;
            const linearVelocity = frame.getSensor(LinearVelocitySensor, this.uid);
            linearVelocity.value = LinearVelocity.fromArray(accl.value.clone().multiplyScalar(dt).toArray());
            linearVelocity.frequency = accl.frequency;
            const position = object.getPosition();
            if (!position) {
                return resolve(object);
            }
            if (!position.linearVelocity) {
                position.linearVelocity = linearVelocity.value.clone();
            } else {
                position.linearVelocity.add(linearVelocity.value);
            }
            resolve(object);
        });
    }
}