A custom Node-RED node that encapsulated a WASM-based, inverse-kinamtic solver for the KUKA LBR iiwa r800 7-axis robotic arm.
GetNumJoints
ComputeFK
ComputeIK
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
- JavaScript typed arrays
- Hello World in WebAssembly
- Passing and returning array parameters
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.