====== 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.