This repo provides an RCL (ROS Client Library) that allows for a
Prolog process to create one or more nodes in a ROS network. The aim of
this library is to support demanding applications. The client exploits
SWI-Prolog's scalable multi-threading capabilities that lets you use all
cores. The file EVAL.md is a very crude evaluation that indicates that
the performance is significantly better than rclpy
, the standard
Python client library for ROS.
WARNING
This repo provides a first version of the SWI-Prolog ROS2 bridge. Not all functionality is provided and most of the interface is not well tested. Still, the current version should be enough for evaluation and prototyping.
- Make sure to have SWI-Prolog installed (8.3.22 or later) and accessible
in $PATH as
swipl
. - clone into
src
below your ROS2 workspace - Build using
colcon build
- Currently the library has only been tested using the ROS2 foxy distribution on Linux (Ubuntu 20.04, AMD64).
- Most likely it will run on any Linux platform, both 32 and 64 bits.
- It may work on most other POSIX like systems. It will not (yet) work on Windows.
- Some of the RCL/RMW ROS2 core library functions have changed since foxy, so running on the latest ROS2 will require a few (minor) changes.
The directory rclswi/examples
contains several small test programs and
examples. To run any of these, from your ROS2 workspace, assuming
default directory structure
swipl -p library=install/rclswi/prolog src/rclswi/examples/demo.pl
See examples/README.md for an overview and the content of the various files for details.
The library is documented using PlDoc. To view the documentation in a browser run the command below to create an HTTP server at http://localhost:8080.
swipl -p library=install/rclswi/prolog src/rclswi/examples/doc.pl [option ...]
Options processed are --port=Port
to select an alternative port
(default 8080) and --no-doc
to just load the code without starting a
web server.
Use the directory menu on the top-left to select the rclswi/prolog
directory and select ros.pl
.
For comments and questions, please use either the SWI-Prolog Discourse forum or ROS questions and answers. Bug fixes and feature requests can use the issue tracker of the GitHub repository.
All contributions are welcome: example code, fixes, better interfaces, ports, tests, etc. Please provide as Git pull requests if possible.
The listb below is lists parts of the RCL functionality and what is supported by the current version of rclswi.
- Type handling
- Convert message from C to Prolog
- Deal with arrays
- Fixed arrays
- Deal with arrays
- Dynamic arrays
- Deal with wide strings (are these UTF-16?)
- Convert message from Prolog to C See https://github.com/osrf/dynamic_message_introspection
- At the moment dict key names are created on the fly from the type introspection data. This is needlessly slow.
- Should we allow the user to tweak the conversion by providing dict tags and keys and choices for text conversion (atom/string)?
- Convert message from C to Prolog
- Object live-time handling, i.e., make nodes depend on objects associated with the node handle.
- Parameter handling
- Declare node parameters
- Populate declared parameters from arguments and launch data
- Change parameters
- Publish changes on
/parameter_events
- Provide a callback on parameter changes
- Enumerate, get and set parameters on named nodes
- Graph tracking
- Query the ROS node graph
- Enumerate nodes
- Enumerate topics and types
- Enumerate services and types
- Enumerate actions and types
- Query the ROS node graph
- Deal with logging
- configure and generate ROS log messages
- Bridge from SWI-Prolog
print_message/2
anddebug/3
- print_message/2 is only forwarded for non-interactive sessions.
- Defaults should depend on whether a session is interactive
- Deal with services
- Low level interface: read/write request/response, wait for client and service.
- High level interface.
- Client
- Synchronous calls
- ASynchronous calls
- Service
- Read/compute/reply loop
- Callback based
- Client
- Deal with actions
- Action type introspection
- Low level interface for creating an action client or server
- Receiving feedback and status
- Access to the goals, results and cancel services
- QoS support
- High level action API
- DCG based action client
- Callback based client
- action server
- Deal with clocks
- Basics for creating a clock and asking its time
- Deal with timers
- Deal with guard conditions
- Advanced configuration
- Provide access to the QoS policies
- ROS2 Lifecycle support?
- Integration into ROS deployment
- Build, portability
- Find the right SWI-Prolog
- Use
rclutils
to get some portable alternatives
- Allow running a ROS node interactively from Prolog
- Make installation follow the SWI-Prolog pack structure so we can attach the ROS API as a pack.
- Allow deploying a ROS node using
ros2 run
- How to do that?
- Pass command line options into
rcl_init()
andrcl_node_init()
- Provide a skeleton project
- Query the
share
directory of a package
- Build, portability
- Process cleanup
- Properly handle signals asynchronously (Control-C)
- Finish and reclaim resources in the right order.
- Documentation
- In code documentation
- Local HTTP server for documentation (see above)
- Generate a stand-alone document
- Testing
- Performance evaluation