Libraries for compiling C++ ROS nodes to Webassembly using Emscripten. Allows you to write C++ ROS nodes similar to how you would otherwise, and to then have them run in a webbrowser and communicate with ROS through rosbridge_websocket
.
- Emscripten tested with version
1.39.10
but latest should do - rosbridge_suite after the commit adding cbor-raw compression, latest
develop
should do:git clone https://github.com/RobotWebTools/rosbridge_suite -b develop # in workspace src folder
catkin build
is recommended, since catkin_make
might leak configurations to other packages.
Make sure to source the Emscripten environment
before building the package:
source /path/to/emsdk/emsdk_env.sh
catkin build
roscpp_json_serialize
- library that serializes ROS messages to and from jsonroswasm
- contains theroswasm
client library and configures cmake to build dependent packages using Emscripten. It supports publishers, subscribers, service clients and timersroswasm_tutorials
- contains examples corresponding totalker
,listener
andtimers
ofroscpp
roswasm_webgui
- a proof of concept implementation of a ROS GUI library based onroswasm
andimgui
The roswasm
client library presents an API similar to roscpp
, with the
main differences being that most interfaces are heap allocated, and that Emscripten
manages the event loop. Below is a shortened version of the corresponding
listener
example implementation.
#include <emscripten.h>
#include <roswasm/roswasm.h>
#include <std_msgs/String.h>
roswasm::NodeHandle* n;
roswasm::Subscriber* sub;
void chatterCallback(const std_msgs::String& msg)
{
printf("I heard: [%s]\n", msg.data.c_str());
}
void loop() {}
extern "C" int main(int argc, char** argv)
{
n = new roswasm::NodeHandle();
sub = n->subscribe<std_msgs::String>("chatter", chatterCallback);
emscripten_set_main_loop(loop, 10, 1);
return 0;
}
For more complete examples, see the roswasm_tutorials
package.
The roswasm
library uses catkin
to build an emscripten project.
All you have to do in your package that is using roswasm
is to add
it as a dependency in your cmake
file and link against
${roswasm_LIBRARIES}
. It will automatically set the Emscripten
em++
compiler as the default for building and linking nodes.
Note that you have to install and source the emscripten SDK before
building your workspace. The following minimal cmake
file includes
a guard to check that Emscripten is present.
cmake_minimum_required(VERSION 2.8.3)
project(listener)
find_package(catkin REQUIRED COMPONENTS roscpp roswasm std_msgs)
catkin_package()
if (DEFINED ENV{EMSDK})
include_directories(${catkin_INCLUDE_DIRS})
add_executable(listener src/listener.cpp)
set_target_properties(listener PROPERTIES OUTPUT_NAME "listener.js")
target_link_libraries(listener ${roswasm_LIBRARIES})
configure_file(www/listener.html ${CATKIN_DEVEL_PREFIX}/${CATKIN_PACKAGE_BIN_DESTINATION}/listener.html COPYONLY)
endif()
Before starting any of the roswasm nodes, you need to have one instance of rosbridge_websocket
running:
roslaunch rosbridge_server rosbridge_websocket.launch
After building your node, you can run it similar to the following command:
rosrun roswasm run.py _pkg:=roswasm_tutorials _node:=listener.html _display_port:=8080
This will start a webserver and allow you to view the page at localhost:8080
.
If you want to see the output from the node, open the browser debug console.
There is a also a convenience launch file to run both rosbridge_websocket
as well as your roswasm
node at the same time:
roslaunch roswasm run_server.launch pkg:=roswasm_tutorials node:=listener.html