我已经在我的机器上安装了KnowRob(出于兼容性原因,使用ros-indigo的Ubuntu 14.04)并创建了一个具有以下内容的.pl文件:
:- module(utils, [object_hierarchy/2]).
object_hierarchy_internal_none(Child,Parent) :-
not(owl_has(Parent, knowrob:properPhysicalParts, Child)).
object_hierarchy_internal(Item, Hierarchy, HierarchyFinal) :-
(
object_hierarchy_internal_none(Item, _)
,
HierarchyFinal = Hierarchy
)
;
(
owl_has(Parent, knowrob:properPhysicalParts, Item)
,
append(Hierarchy, [Parent], ExtendedHierarchy)
,
object_hierarchy_internal(Item, Parent, ExtendedHierarchy, HierarchyFinal)
)
.
object_hierarchy(Item, Hierarchy) :- object_hierarchy_internal(Item, [], Hierarchy).
它的作用并不重要,但基本上object_hierarchy
在外部被调用,并使用内部谓词来完成工作。这些内部谓词使用谓词owl_has/3
。具体来说,它将它与用户正在传递的Ìtem
变量一起使用。
终端的启动和设置如下:
rosrun rosprolog rosprolog knowrob_common
? owl_parse('package://knowrob_map_date/owl/ccrl2_semantic_map.owl')
我尝试使用知识库,即object_hierarchy
,如下所示(为Item
提供合适的实例):
? object_hierarchy(knowrob:'Handle127', Hierarchy).
不幸的是,这不是正确的方法,因为它会导致以下异常消息:
ERROR: rdf_db:rdf/3: Type error: `rdf_object' expected, found `rdf_object(knowrob:Handle127)'
Exception: (13) t20_owl:owl_has_direct(_G2589, knowrob:properPhysicalParts, knowrob:'Handle127')
我想知道如何修改代码以使其有意工作。