1.1.0 • Published 3 years ago

node-red-contrib-rwth-bcma v1.1.0

Weekly downloads
-
License
MIT
Repository
gitlab
Last release
3 years ago

Inverse Kinematic Node

npm.io

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

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.

WASM Examples ( as a reference )

1.1.0

3 years ago

1.0.0

3 years ago

0.0.2

4 years ago