This section very briefly describes how the entire simulator is composed. The main part with the GUI is the Nengo simulator, which provides:
- graphical interface
- scripting Jython interface
- simulation engine (not necessarily used)
- simulation of large scale neural systems
- java implementation of ros master
- generator of java inerfaces for custom and standard ROS messages
- complete java libraries and build tools for writing and running own ROS nodes in java
This project integrates the two above into the simulator of large scale, highly modular and decentralized systems with almost arbitrary purpose, ranging from purely SW tools towards use in robotics.
The Nengoros system is able to use either existing installed ROS components (e.g. roscore) with possibility to use currently existing ROS nodes, or to run completely in Java – independent of any ROS installation.
Neural Modules = Encapsulated ROS Nodes
The software provides possibility to represent current ROS (Java, C++, Python) nodes as so-called Neural Modules. Each module can represent one or more ROS nodes. Typical properties of neural module are:
- It contains one `modem` which translates communication between ROS messages and the Nengo simulator.
- Contains one or more ROS nodes of arbitrary type.
- The ROS nodes contained in the module do not have to communicate with the Nengo (with modem).
- Can contain sub-network of externally running ROS nodes.
Neural Module added into the simulation can be of two types so far, where both types can be used at the same simulation:
- Asynchronous: each time step, Nengo encodes data by modem and sends to ROS nodes, decodes any data incoming from ROS nodes and sends into internal network.
- Synchronous: each time step, the data are encoded and sent to ROS nodes, Nengo then waits for receiving data messages form each synchronous .
- Time-representing: this mode will be implemented in the near future. Each time step, the Nengo takes part of time series, encodes by modem(s), sends ROS nodes and waits for the answer. This will enable explicit representation of time, but will have to be supported by ROS messages (nodes).
By this way, the Nengo can be used either as a simulation master (defining time-steps) or as an ordinary participant in the ROS network (with own time representation so far).
Modem – Translate Data Between ROS-Nengo
ROS nodes communicate over the TCP/IP protocol by means of two main types of communication:
- publisher/subscriber – some nodes publish data on given topic(s), other are subscribed
- service/client – one node provides service and other clients use it
Currently, the Nengoros supports the publisher/subscriber model. Each Neural Module contains own modem. In each modem, there is arbitrary number of encoders and decoders.
- Encoders translate Nengo real-valued communication (array of float values) into the ROS messages and publishes on defined topic.
- Decoders are subscribed to selected topic, convert incoming ROS messages into the Nengo real-valued communication.
This means that encoders/decoders define how the data sent over the ROS network will be interpreted in the Nengo simulation. By writing own encoder/decoder, the user can define own support for arbitrary ROS message.
Information about this project can be found in three main sources:
- This webpage with tutorials
- Each (sub)project contains one or more README.md files
- JavaDocs can be easily generated by the Gradle, this can be done with the following commands:
cd nengoros ./gradlew javadoc
Generated Javadocs are then placed for each (sub)project under: `[projectName]/build/docs/javadoc/index.html `.