Meta-information about environment maps

Robots sometimes face the problem how to represent which environment is described inside a map. In the context of the RoboEarth project, which dealt with the exchange of knowledge between robots, this was required to enable robots to query for a map based on a specification of which environment it describes. The following approach has been chosen in the RoboEarth context:

There can be multiple maps describing the same environment in possibly different ways, for example a 2D occupancy grid, used e.g. for laser-based localization, or a semantic environment map, consisting of object instances and their properties. These can all be assigned to the same room/floor/building, and the downloading robot can decide which one to use based on its properties and requirements.

Objects in the map

The objects in the map are represented using the general spatio-temporal object pose representation used in KnowRob. This allows to incorporate more current information about the objects, e.g. updated poses, transparently by just storing the novel detections.

Articulation information is stored as a property of the respective objects. The relation between an object's parts (e.g. the frame of a cupboard and its door) is explicitly described using OWL properties, and articulation properties like joint limits are attached to the hinge. The representation is compatible to the description of joints in the ROS articulation stack.

Rotational joints

The general structure for rotational joints is the following:

The rotation happens around the z-axis of the joint, described by the pose matrix observed by TouchPerception11 (the tactile estimation of the joint parameters).

Prismatic joints

Prismatic joints are described in a similar way, though the parameters are obviously slightly different from rotational joints:

The direction of articulation of prismatic joints is explicitly described by a direction vector.

Example queries

Query for a map that belongs a room #3001 in Munich:

 ?- rdf_has(M, rdfs:label, literal(like('*Munich*'), _)), 
    owl_has(M, knowrob:properPhysicalParts, R), 
    owl_has(R, knowrob:roomNumber, literal(type(_, '3001'))), 
    owl_has(R, knowrob:describedInMap, Map).
 M = 'http://knowrob.org/kb/ias_hospital_room.owl#Munich',
 R = 'http://knowrob.org/kb/ias_hospital_room.owl#Room7635',
 Map = 'http://knowrob.org/kb/ias_hospital_room.owl#SemanticEnvironmentMap7635'