Open Hybrid Positioning System - Core component
npm install @openhps/core
bash
npm install @openhps/core --save
`
The core idea and goals of OpenHPS are outlined in the technical paper: OpenHPS: An Open Source Hybrid Positioning System.
Usage
OpenHPS uses a process network to create a positioning system. This process network is created using the ModelBuilder. Every model starts with the creation
of a new model that starts from a source node and passed via a set of processing nodes until it arrives to a sink node.
`typescript
import { ModelBuilder, DataObject, Absolute2DPosition, SMAFilterNode, ReferenceSpace, Euler, AngleUnit } from '@openhps/core';
import { MouseSourceNode } from './MouseSourceNode';
import { ChartSinkNode } from './ChartSinkNode';
const mouseReferenceSpace = new ReferenceSpace()
.translation(0, 200)
.rotation(new Euler(180, 0, 0, 'ZXY', AngleUnit.DEGREE));
ModelBuilder.create()
// Step 1. Obtain X,Y location from mouse (active source node)
.from(new MouseSourceNode("trackArea"))
// Step 2. Flip the axis
.convertFromSpace(mouseReferenceSpace)
// Step 3. Simple moving average of the X,Y position (average of 40 readings)
.via(new SMAFilterNode((obj: DataObject) => ([
{ key: "x", value: (obj.position as Absolute2DPosition).x },
{ key: "y", value: (obj.position as Absolute2DPosition).y }
]),
(key: string, value: number, obj: DataObject) => { obj.position[key] = value },
{ taps: 40 })
)
// Step 4. Plot the results
.to(new ChartSinkNode("mouseChart"))
.build().then(model => {
// ...
});
`
See https://openhps.org/docs/tutorials/mouse/ for the implementation of the source and sink node
$3
- openhps-core.js: UMD
- openhps-core.es.js: ES6 import
- worker.openhps-core.js: UMD worker
- openhps-core-lite.js: UMD lite version for embedded systems
Documentation
The documentation for OpenHPS can be found online on the website.
$3
The JOSS paper can be found here: /docs/paper/paper.md.
$3
Please check https://openhps.org/publications/ for more information.
$3
`mermaid
classDiagram
class ActuatorProperty{
+name: string
+callback: (...args: any[]) =~ Promise~any~
}
class ActuatorObject{
#properties: Map~string, ActuatorProperty~
+invoke() Promise~any~
}
DataObject<|--ActuatorObject
class DataObject{
+displayName: string
+createdTimestamp: number
+uid: string
-_position: AbsolutePosition
-_relativePositions: Map~string, Map~string, RelativePosition~any, Unit~~~
+parentUID: string
+getPosition() AbsolutePosition
+setPosition() this
+setUID() this
+setParent() this
+removeRelativePositions() void
+addRelativePosition() this
+getRelativePositions() RelativePosition~any, Unit~[]
+getRelativePosition() RelativePosition~any, Unit~
+hasRelativePosition() boolean
+bind() DataObjectBinding~this~
+clone() T
}
class SensorCalibrationData~T~{
+unit?: Unit
+offset?: T
+multiplier?: T
}
class SensorObject~T~{
+value: T
+frequency: number
+calibrationData?: SensorCalibrationData~T~
}
DataObject<|--SensorObject~T~
class ReferenceSpace{
-_translationMatrix: Matrix4
-_transformationMatrix: Matrix4
-_scaleMatrix: Matrix4
-_rotation: Quaternion
-_unit: LengthUnit
-_parent: TransformationSpace
+fromDataObject() ReferenceSpace$
+update() Promise~void~
+orthographic() ReferenceSpace
+perspective() ReferenceSpace
+reset() ReferenceSpace
+referenceUnit() ReferenceSpace
+translation() ReferenceSpace
+scale() ReferenceSpace
+rotation() ReferenceSpace
+transform() Out
}
DataObject<|--ReferenceSpace
TransformationSpace<|..ReferenceSpace
class TransformationSpace {
<>
+uid: string
+parent: TransformationSpace
+update() Promise~void~
+transform() Out
}
class SpaceTransformationOptions {
<>
+inverse?: boolean
}
TransformationSpace -- TransformationSpace
`
Contributing
Use of OpenHPS, contributions and feedback is highly appreciated. Please read our contributing guidelines for more information.
If you want to contribute to the core of OpenHPS, you will want to build the repo.
1. Using yarn, install the dependencies yarn install
2. Build OpenHPS using npm run build, this will also transpile Three.js
3. Run the tests using npm run test
Before submitting a PR, make sure to test the code using npm run test and to fix any linting issues using npm run lint -- --fix`