node-red-contrib-rwth-bcma v1.1.0
Inverse Kinematic Node
This custom node is based on a low-level C++ implementation of an inverse-kinematic solver for an excavator.
The C++ solver was generated using IKFAST, a part of a robotic framework named OpenRAVE.
The method of using WebAssembly in a Node-RED node was inspired by the work of phyunsj
with this
this repository: https://github.com/phyunsj/node-red-native-addon
Compiling ik.c -> ik.wasm
Development
emcc --no-entry -o ik.wasm ik.cpp -Oz --profiling-funcs -s WASM=1 -s STANDALONE_WASM
Production
emcc --no-entry -o ik.wasm ik.cpp -Os -s WASM=1 -s STANDALONE_WASM
Hydraulic Simulation Node
WIP
Compiling hydraulic.wasm
..\..\emsdk\emsdk.bat activate 3.1.0
emcc --no-entry -fwrapv -DCLASSIC_INTERFACE=0 -DALLOCATIONFCN=1 -DMAT_FILE=0 -DONESTEPFCN=1 -DTERMFCN=1 -DMULTI_INSTANCE_CODE=1 -DINTEGER_CODE=0 -DMT=0 -DRT_MALLOC -DTID01EQ=1 -DMODEL=Open_Center_inport_outport -DNUMST=2 -DNCSTATES=6 -DHAVESTDIO -DRT -DUSE_RTMODEL --include-directory=. --include-directory=C:\PROGRA~1\MATLAB\R2021b\simulink\include --include-directory=C:\PROGRA~1\MATLAB\R2021b\simulink\src --include-directory=C:\PROGRA~1\MATLAB\R2021b\rtw\c\src --include-directory=C:\PROGRA~1\MATLAB\R2021b\rtw\c\src\ext_mode\common --include-directory=C:\PROGRA~1\MATLAB\R2021b\extern\include --include-directory=C:\PROGRA~1\MATLAB\R2021b\toolbox\aeroblks\aeroblks --include-directory=C:\PROGRA~1\MATLAB\R2021b\toolbox\aero\aero\src Open_Center_inport_outport.c Open_Center_inport_outport_data.c rtGetInf.c rtGetNaN.c rt_nonfinite.c rt_malloc_main.c -o hydraulic.wasm -Oz --profiling-funcs -s WASM=1 -s STANDALONE_WASM
Original documentation
This is the documentation from the original repository which I modified.
Passing String (or Array)
WebAssembly doesn't natively support a string type, it rather supports i32 / i64 / f32 / f64 value types as well as i8 / i16 for storage.
var ptr = new Uint8Array(mem.buffer, 0, msg.payload.length );
// String to UTF8
var utf8 = unescape(encodeURIComponent(msg.payload));
for (var i = 0; i < utf8.length; i++) {
ptr[i] = utf8.charCodeAt(i);
}
instance.exports._lowercase(ptr); // Calling lowercase(char *ptr)
// UTF8 to String
msg.payload = utf8ToString(ptr);
You can interact with a WebAssembly instance using:
- exports, where from JavaScript you call into WebAssembly, and WebAssembly returns a single value type.
- imports where WebAssembly calls into JavaScript, with as many value types as you want (note: the count must be known at Module compilation time, this isn't an array and isn't variadic).
- Memory.buffer, which is an ArrayBuffer that can be indexed using (among others) Uint8Array.
More about Array
Related Posts
- MDN WebAssembly documentation
- Code examples that accompany MDN WebAssembly documentation
- WebAssembly Example
- Standalone WebAssembly Example
- Cheerp Tutorial: Mixed mode C++ to WebAssembly and JavaScript
- Writing WebAssembly By Hand
- Emscripten
- Interacting with Code
- Emscripting a C library to Wasm
WASM Compilation
Option 1. Emscripten SDK
- Installation (Linux or OS X)
$ git clone https://github.com/juj/emsdk.git
$ cd emsdk
$ ./emsdk install latest
$ ./emsdk activate latest
$ source ./emsdk_env.sh
- Compilation with emcc
$ emcc main.c -s WASM=1 -o app.html
- Additional Toolkit WABT:WebAssembly Binary Toolkit
Option 2. WebAssembly for Node
wa-compile
-o main.wasm main.c
wa-link
utility links multiple wasm files to one.