The splat system provides the constructor hc-blending-navigation-policy which implements a fuzzy combination of the output associated with a set of controllers (control experts). The code below shows how we could use this constructuor to implement the stopping controller.4.5, 4.6
(depend 'splat-system)
(define-splat (stopping-controller robot stopping-distance vmax time-stop)
(local-vars (vset 0) (front-distance #f))
(initializer (semaphore-wait (base-control-mutex robot)))
(finalizer (halt robot) (semaphore-signal (base-control-mutex robot)))
(method
#t ;;;; the method is always applicable
(define (speed-controller)
(let* ((v #t) (xt #f)
(k (sqrt (/ (* 2 vmax ) time-stop )))
(xp (sqr (* k (/ time-stop 2.0))))
)
(set! xt (max 0 (- front-distance stopping-distance)))
(set! v (if (> xt xp) vmax (* k (sqrt xt))))
))
(run
(hc-blending-navigation-policy
(loop-delay 0.1)
(state-updater
(lambda ()
(bind ((dir dist (min-free-space robot (deg->rad -10) (deg->rad 10))))
(set! front-distance dist))
(set! vset (speed-controller))))
(control-expert (lambda () (values 1.0 0 vset )))
(termination-expert (lambda () (< front-distance stopping-distance)))
(control-thunk (lambda (turn drive) (set-drive-and-turn robot drive turn)))
))
(method-finish self 'method-succeeded)
)
)
The main core of the splat is the hc-blending-navigation-policy which implements a fuzzy combination of the output associated with a set of controllers (control experts). Its general form is
(hc-blending-navigation-policy (loop-delay delay-time) (state-updater code) (control-expert code)... (control-expert code) (termination-expert code) ... (termination-expert code) (control-thunk code) )A hc-blending-navigation-policy returns a splat which is executed until one or more of its termination-experts become true. This type of splat has a built in loop defined as:
1. Execute the code associated with the state-updater
2. Execute the code associated with each control-expert
3. Set output to the fuzzy combination associated of the values returned
by the different control-experts
4. Call the code associated with control-thunk with output as a parameter
5. Sleep delay-time seconds
The state-updater code usually calculates values that are shared by the different experts. Any lambda expression could be the code of a state-updater form.
The code associated with a control-expert should return
(values applicability rotational-speed forward-speed)In our example, we only have one control expert and one termination expert. Our control expert always has applicability 1.0, rotational-speed 0 and forward velocity as calculated by the function speed-controller.
Notice that in the body of the splat's method we have the expression (run (hc-blending-navigation-policy ...)) instead of (hc-blending-navigation-policy ...) alone. This latter expression returns (denotes) a splat which is then executed by calling the method run on it.