====== Commonsense knowledge about object locations ====== ~~NOTOC~~ \\ ^ This page describes the 'catkinized' version of KnowRob that uses the [[http://wiki.ros.org/catkin/|catkin buildsystem]] and the pure Java-based [[http://wiki.ros.org/rosjava|rosjava]]. The documentation for the older version, which was based on the rosbuild buildsystem and rosjava_jni, can be found [[/doc/common-sense_reasoning_about_object_locations?rev=1401968329|here]].^ \\ Commonsense knowledge about typical object locations was acquired by the Open Mind Indoor Common Sense (OMICS [[http://openmind.hri-us.com/]]) project. We processed the natural language database entries and translated them to well-defined concepts within the KnowRob ontology as described in [[http://ias.cs.tum.edu/_media/spezial/bib/kunze10omics.pdf|Putting People's Common Sense into Knowledge Bases of Household Robots]]. In [[http://ias.cs.tum.edu/_media/spezial/bib/kunze12objsearch.pdf| Searching Objects in Large-scale Indoor Environments: A Decision-thereotic Approach]] we applied this knowledge in object search tasks. ===== Getting Started ===== You have to build the //knowrob_omics// package in //knowrob_addons// and run it using rosprolog. rosrun rosprolog rosprolog knowrob_omics ===== Queries about object locations ===== To query the probability of finding an object in a given room type you can use the following query: ?- probability_given(knowrob:'OmicsLocations', Obj, knowrob:'Kitchen', Pr). Obj = knowrob:'CitrusFruit', Pr = 0.0038510911424903724 ; Obj = knowrob:'Bowl-Eating', Pr = 0.006418485237483954 ; Obj = knowrob:'PhysicalDevice', Pr = 0.037227214377406934 ; Obj = knowrob:'Vegetable-Food', Pr = 0.006418485237483954 If you are interested in what type of room you could find a given object use the following query: ?- bayes_probability_given(knowrob:'OmicsLocations', Room, knowrob:'Sandwich',Pr). Room = knowrob:'Kitchen', Pr = 0.20109219415371862 ; Room = knowrob:'OfficeRoom', Pr = 0.046915489441673196 ; Room = knowrob:'Hallway', Pr = 0.06843635615803703 ; Room = knowrob:'Classroom', Pr = 0.07637777632654648 You can see the processed database table entries with: ?- rdf_has(Entry, rdf:type, knowrob:'OmicsLocations'), rdf_has(Entry,knowrob:subject,Obj), rdf_has(Entry,knowrob:object,Room). Entry = knowrob:'OmicsLocations-0', Obj = knowrob:'CitrusFruit', Room = knowrob:'Kitchen' ; Entry = knowrob:'OmicsLocations-1', Obj = knowrob:'Bowl-Eating', Room = knowrob:'Kitchen' ; Entry = knowrob:'OmicsLocations-10', Obj = knowrob:'PhysicalDevice', Room = knowrob:'Kitchen' ; Entry = knowrob:'OmicsLocations-100', Obj = knowrob:'Vegetable-Food', Room = knowrob:'Kitchen' Get the list of Room types: ?- findall(Room, (rdf_has(Entry, rdf:type, knowrob:'OmicsLocations'), rdf_has(Entry,knowrob:object,Room)), _Rooms), list_to_set(_Rooms,RoomSet). RoomSet =[knowrob:'Kitchen', knowrob:'OfficeRoom', knowrob:'Hallway', knowrob:'Classroom', knowrob:'ConferenceRoom', knowrob:'RestaurantSpace', knowrob:'LockerRoom', knowrob:'AuditoriumRoom', knowrob:'Laboratory', knowrob:'HospitalRoom']. The findall may produce duplicate results, which are eliminated by the //list_to_set// predicate. The underscore in the _Rooms variable indicates that the value of this variable is not returned as a result.