===== How to register and achieve a new goal =====
==== A plan for a new goal ====
Let's assume we wanna write a plan to achieve a new goal, e.g. to flip a pancake. Best practice is to put this plan into one of the source-files of a plan library, e.g. cram_plan_library:
(def-goal (achieve (flip-pancake ...))
(with-designators ((action-desig
(action `((to flip))))
...)
...
(perform action)))
If you want other packages to also use this plan, export the goal-symbol in the package.lisp of the your plan library. Make sure to also export all designator properties used in your plan:
(desig-props:def-desig-package cram-plan-library
...
(:export #:...
#:flip-pancake
...)
(:desig-properties #:to #:flip ...))
Catch #1: If you one of your manipulation process modules, e.g. the pr2_manipulation_process_module, uses the same designator properties it also has to export the same properties. I (Georg) do not understand why but Jan says this necessary for them to talk about the same symbol.
Catch #2: You also need to export the goal-symbol, i.e. flip-pancake, from the package cram_plan_knowledge! The reason for this was not clear at the time of writing... Thus, yuo also need to add #:flip-pancake to package.lisp of cram_plan_library. Otherwise you will get a warning like this when trying to achieve flip-pancake:
WARNING:
Trying to prove goal (FLIP-PANCAKE
#) with undefined functor CRAM-PLAN-LIBRARY:FLIP-PANCAKE.
==== How to use/achieve the new plan ====
You can now try to achieve your new goal like this:
(top-level
(cpm:with-process-modules-running
(pr2-manipulation-process-module)
(achieve `(flip-pancake))))
You need to make sure that cram_environment_representation is loaded (either in your package that uses cram_plan_library or in your REPL). Otherwise (holds ...) will not be known.