Omniplanner provides an interface to solving DSG-grounded planning problems with a variety of solvers and grounding mechanisms. The goal is to enable module design of command grounding and planning implementations, and a clean hook for transforming the output of a planner into robot-compatible input.
This repo is still under construction, and details are subject to change.
The Omniplanner architecture can be thought of in two halves: The Omniplanner ROS node that provides an interface for combining planning commands, scene representations, and robot commands, and the Omniplanner non-ROS code that defines the generic interfaces that a planner or language grounding system needs to implement to work with the Omniplanner node.
The planner plugins that Omniplanner loads are defined in a yaml file like this one. The omniplanner node takes the path to this as a rosparam.
Implementing a planner plugin requires implementing Omniplanner's
ground_problem
and make_plan
interface. At planning time, various planning
and grounding methods can be combined through dispatching on the input and
output types of these modules. You need to implement an interface like
this
to give the omniplanner node a hook into your planning and grounding behavior.
The second thing you need to do is implement the ROS hook. This entails
writing a class like this
with a get_plan_callback
function. You also need to implement the config
registration at the bottom of the file to enable constructing the plugin
based on the plugin YAML definition.
Currently, there is a final step of importing your custom config into the Omniplanner Node here, but the intention is to do automatic plugin discovery. Automatic plugin discovery will enable all downstream planning plugins to be implemented without touching the omniplanner node.