Overview
As of Fuerte, roslisp has support for persistent services through the class PERSISTENT-SERVICE. The main difference to using CALL-SERVICE is that the connection to the service server is kept open until it is explicitly shut down using CLOSE-PERSISTENT-SERVICE. This avoids unnecessary and slow calls to the ROS core but the user needs to take special care when the server is shut down. The PERSISTENT-SERVICE instance becomes invalid in that case.
Using persistent services
(defvar *persistent-add-two-ints-client* nil)
(defun call-add-two-ints (a b)
(unless *persistent-add-two-ints-client*
(setf *persistent-add-two-ints-client*
(make-instance 'roslisp:persistent-service
:service-name "add_two_ints"
:service-type "roscpp_tutorials/TwoInts")))
(roslisp:call-persistent-service
*persistent-add-two-ints-client*
(make-service-request 'roscpp_tutorials-srv:TwoInts :a 1 :b 2)))Note that the code above doesn't handle restarts of the server. If the connection becomes invalid, a condition (normally of type END-OF-FILE will be thrown. CALL-PERSISTENT-SERVICE provides a RECONNECT restart that tries to re-establish the connection between the server and the client. The following code snippet shows how to use the restart:
(let ((restarted nil))
(handler-bind ((end-of-file (lambda (e)
(declare (ignore e))
(unless restarted
(setf restarted t)
(invoke-restart 'roslisp:reconnect)))))
(roslisp:call-persistent-service
*persistent-add-two-ints-client*
(make-service-request 'roscpp_tutorials-srv:TwoInts :a 1 :b 2))))