Logging using predicates that are in knowrob_cram/knowrob_cram.pl

It is suggested before starting that take a look at predicates in knowrob_cram.pl. If you have questions regarding the usage of predicates, contact me (asil@cs.uni-bremen.de)

JSONProlog based solution (without openEASE in the loop)

1) In order to be able to import the asserted log events to an owl file with ease, you will need to use Asil's fork of knowrob_addons in “devel” branch. The changes will be merged with main branch soon

2) Start your roscore and json_prolog service.

3) Register predicates in knowrob_cram package w/ prolog query: register_ros_package('knowrob_cram').

4) You can ready to assert some logging inside

  Some example queries: 
       %Starts an task with type CRAMAction and context DummyContext at time 1492785072
       %Since Parent Task parameter (PA) is unbound, there will be no parent task of this action
       cram_start_action(knowrob:'CRAMAction', 'DummyContext', 1492785072, PA, ActionInst).
       %Task name will be returned in variable ActionInst.
       
       %Finish the task that previous query started. 
       cram_finish_action(knowrob:'CRAMAction_SAPQB1', 1492785075). 
       % knowrob:'CRAMAction_SAPQB1' is returned in ActionInst at previous query
       
       %Export to owl. 
       rdf_save('/home/asil/test.owl', [graph('LoggingGraph')]). 

openEASE based solution (connecting openEASE from your JSONProlog service) In order to use this feature, you will need to use Asil's fork of knowrob_addons in “devel” branch. The changes will be merged with main branch soon

It is suggested before starting that take a look at predicates in knowrob_cloud_logger/knowrob_cloud_logger.pl. If you have questions regarding the usage of predicates, contact me (asil@cs.uni-bremen.de)

The latest changes in openEASE are not pushed in the erface connected“ “Container started.” main seerver yet. You can use local openEASE instance at 192.168.100.219 for now.

a) Creating API token and saving certificate of openEASE

0) Browse to https://192.168.100.219 careful not starting with http: ;) and make a security exception for self-signed certificate

1) Using registration pane, create a user account for yourself from openease web interface.

2) Log in with your crediantial and, then, go to Tools/User Details from Menu.

3) Create an API token by clicking ”(create new)“

4) Save this token in somewhere safe since this is your personel token that will authenticate you for openEASE from jsonprolog service

5) After creation of api token, now it is time to save the certificate… Click lock symbol next to address symbol in Firefox. Then click to arrow ”>“.

6) You will see a popup window.. Click to “View Certificate” from this popup.

7) Switch to Details tab. Finally, click export in order to save the certificate to your local drive in crt format.

8) Open a terminal and export the certificate to pem format with following command:

      
      openssl x509 -in mycert.crt -out mycert.pem -outform PEM

b) Using API token and saved certificate, connecting to openEASE from json_prolog

1) Start your roscore and json_prolog service.

2) Register predicates in knowrob_cloud_logger package w/ prolog query: register_ros_package('knowrob_cloud_logger').

3) Authenticate yourself and start your user container

       % Connection and Authentication to server 
       cloud_interface('https://192.168.100.219','/home/asil/localhost.crt.pem','PrivateAPIToken').
       
       % Start your user container on the server side 
       start_user_container.
       % Connect to the user container
       connect_to_user_container.

4) Sending queries:

      
       % Send query. ID variable will return the id of the query assigned by openease. 
       % This id will be used for getting next solution 
       send_prolog_query('cram_start_action(knowrob:\'CRAMAction\', \'DummyContext\', 1492785072, PA, ActionInst)', @(false), Id).
                
       % Get the solution to buffer
       send_next_solution('fa04359f-e0bf-4540-941c-3cae79e6eb89').
       
       % Reach the registered solution 
       read_next_prolog_query(Result).
      

5) Saving asserted facts (the path for owl file should be in /home/ros/user_data where user has write access):

       % Send query. ID variable will return the id of the query assigned by openease. 
       % This id will be used for getting next solution 
       send_prolog_query('rdf_save(\'/home/ros/user_data/test.owl\', [graph(\'LoggingGraph\')]).', @(false), Id).
                
       % Get the solution to buffer
       send_next_solution('fa04359f-e0bf-4540-941c-3cae79e6eb89').

6) Reaching the owl file: Go to openEASE web interface that you made logging (in our case: https://192.168.100.219) and log-in with your credentials. Then, navigate to “view-source:192.168.100.219/user_data/[YourEpisodicMemoryName].owl” from Firefox address bar. Finally, right click to the source file and saving it will let you keep the episodic memory in your local drive

Troubleshooting

Q: I get an error

   javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names present
      at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
      at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1959)
      at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302)
      at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296)
      at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1514)
      at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216)
      at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1026)
      at sun.security.ssl.Handshaker.process_record(Handshaker.java:961)
      at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1072)
      at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1385)
      at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1413)
      at jpl.Query.hasMoreSolutions(Query.java:258)
      at jpl.Query.allSolutions(Query.java:556)
      at org.knowrob.json_prolog.query.AllSolutionsCommand.execute(AllSolutionsCommand.java:6)
      at org.knowrob.json_prolog.query.ThreadedQuery.run(ThreadedQuery.java:140)
      at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
      at java.util.concurrent.FutureTask.run(FutureTask.java:266)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
      at java.lang.Thread.run(Thread.java:748)
    Caused by: java.security.cert.CertificateException: No subject alternative names present
      at sun.security.util.HostnameChecker.matchIP(HostnameChecker.java:145)
      at sun.security.util.HostnameChecker.match(HostnameChecker.java:94)
      at sun.security.ssl.X509TrustManagerImpl.checkIdentity(X509TrustManagerImpl.java:455)
      at sun.security.ssl.X509TrustManagerImpl.checkIdentity(X509TrustManagerImpl.java:436)
      at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:200)
      at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)
      at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1496)
      ... 26 more
   java.lang.Exception: jpl.PrologException: PrologException: 
   error(java_exception(@('J#00000139763201972864')), 'org.openease.client.EASEError')
      at org.knowrob.json_prolog.JSONPrologNode$NextSolutionCallback.build(JSONPrologNode.java:308)
      at org.knowrob.json_prolog.JSONPrologNode$NextSolutionCallback.build(JSONPrologNode.java:272)
      at 
   org.ros.internal.node.service.ServiceRequestHandler.handleRequest(ServiceRequestHandler.java:65)
      at org.ros.internal.node.service.ServiceRequestHandler.access$100(ServiceRequestHandler.java:38)
      at org.ros.internal.node.service.ServiceRequestHandler$1.run(ServiceRequestHandler.java:99)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
      at java.lang.Thread.run(Thread.java:748)
   Caused by: jpl.PrologException: PrologException: error(java_exception(@('J#00000139763201972864')), 
 'org.openease.client.EASEError')
      at jpl.Query.get1(Query.java:336)
      at jpl.Query.hasMoreSolutions(Query.java:258)
      at jpl.Query.allSolutions(Query.java:556)
      at org.knowrob.json_prolog.query.AllSolutionsCommand.execute(AllSolutionsCommand.java:6)
      at org.knowrob.json_prolog.query.ThreadedQuery.run(ThreadedQuery.java:140)
      at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
      at java.util.concurrent.FutureTask.run(FutureTask.java:266)
      ... 3 more

Make sure the certificate has the correct expiration date and your correct IP (not just localhost).