Skip to content

Commit f4c9aa1

Browse files
author
Yiannis Gatsoulis
committed
Merge branch 'master' into rcc4
Conflicts: qsr_lib/CMakeLists.txt qsr_lib/src/qsrlib_qsrs/__init__.py
2 parents ca84c49 + 8154129 commit f4c9aa1

27 files changed

+230
-8
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ target/
5858
.idea/
5959

6060
*~
61-
.DS_Store
61+
*.DS_Store*
6262

6363
# DOC
6464
qsr_lib/docs/_build/

qsr_lib/CMakeLists.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,12 @@ if (CATKIN_ENABLE_TESTING)
4848
add_rostest(tests/qtcbs_tester.test)
4949
add_rostest(tests/qtccs_tester.test)
5050
add_rostest(tests/qtcbcs_tester.test)
51+
add_rostest(tests/ra_tester.test)
5152
add_rostest(tests/rcc2_tester.test)
5253
add_rostest(tests/rcc3_tester.test)
5354
add_rostest(tests/rcc4_tester.test)
55+
add_rostest(tests/rcc5_tester.test)
5456
add_rostest(tests/rcc8_tester.test)
55-
add_rostest(tests/multiple_tester.test)
57+
# add_rostest(tests/multiple_tester.test)
5658

5759
endif()

qsr_lib/scripts/example_extended.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ def pretty_print_world_qsr_trace(which_qsr, qsrlib_response_message):
2727

2828

2929
if __name__ == "__main__":
30-
options = ["rcc2", "rcc3", "rcc8", "cardir", "qtcbs", "qtccs", "qtcbcs", "argd", "argprobd", "mos", "multiple"]
30+
options = sorted(QSRlib().qsrs_registry.keys()) + ["multiple"]
3131
multiple = options[:]; multiple.remove("multiple"); multiple.remove("argd"); multiple.remove("argprobd")
3232

3333
parser = argparse.ArgumentParser()
@@ -50,7 +50,7 @@ def pretty_print_world_qsr_trace(which_qsr, qsrlib_response_message):
5050

5151
dynamic_args = {}
5252

53-
if which_qsr == "rcc3" or which_qsr == "rcc2":
53+
if which_qsr in ["rcc2", "rcc3", "ra"]:
5454
dynamic_args = {which_qsr: {"quantisation_factor": args.quantisation_factor}}
5555
o1 = [Object_State(name="o1", timestamp=0, x=1., y=1., xsize=5., ysize=8.),
5656
Object_State(name="o1", timestamp=1, x=1., y=2., xsize=5., ysize=8.),
@@ -69,7 +69,7 @@ def pretty_print_world_qsr_trace(which_qsr, qsrlib_response_message):
6969
world.add_object_state_series(o2)
7070
world.add_object_state_series(o3)
7171

72-
elif which_qsr == "rcc8":
72+
elif which_qsr == "rcc8" or which_qsr == "rcc5":
7373
# dynamic_args = {which_qsr: {"quantisation_factor": args.quantisation_factor}}
7474
o1 = [Object_State(name="o1", timestamp=0, x=1., y=1., xsize=5., ysize=8.),
7575
Object_State(name="o1", timestamp=1, x=1., y=2., xsize=5., ysize=8.),

qsr_lib/src/qsrlib_qsrs/__init__.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from qsr_rcc2 import QSR_RCC2
22
from qsr_rcc3_rectangle_bounding_boxes_2d import QSR_RCC3_Rectangle_Bounding_Boxes_2D
33
from qsr_rcc4 import QSR_RCC4
4+
from qsr_rcc5 import QSR_RCC5
45
from qsr_rcc8 import QSR_RCC8
56
from qsr_cardinal_direction import QSR_Cardinal_Direction
67
from qsr_qtc_b_simplified import QSR_QTC_B_Simplified
@@ -10,11 +11,13 @@
1011
from qsr_arg_prob_relations_distance import QSR_Arg_Prob_Relations_Distance
1112
from qsr_moving_or_stationary import QSR_Moving_or_Stationary
1213
from qsr_new_mwe import QSR_MWE
14+
from qsr_ra import QSR_RA
1315

1416
# register new qsrs by class name below
1517
qsrs_registry = (QSR_RCC2,
1618
QSR_RCC3_Rectangle_Bounding_Boxes_2D,
1719
QSR_RCC4,
20+
QSR_RCC5,
1821
QSR_RCC8,
1922
QSR_Cardinal_Direction,
2023
QSR_QTC_B_Simplified,
@@ -23,4 +26,5 @@
2326
QSR_Arg_Relations_Distance,
2427
QSR_Arg_Prob_Relations_Distance,
2528
QSR_Moving_or_Stationary,
26-
QSR_MWE)
29+
QSR_MWE,
30+
QSR_RA)

qsr_lib/src/qsrlib_qsrs/qsr_abstractclass.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class QSR_Abstractclass(object):
2929
def __init__(self):
3030
"""Constructor."""
3131
self._dtype_map = {"points": self._return_points,
32+
"bounding_boxes": self._return_bounding_boxes_2d, # todo this is to handle 2D/3D and needs its own function
3233
"bounding_boxes_2d": self._return_bounding_boxes_2d}
3334
"""dict: Mapping of _dtype to methods."""
3435

qsr_lib/src/qsrlib_qsrs/qsr_ra.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
# -*- coding: utf-8 -*-
2+
from __future__ import print_function, division
3+
from numpy import isnan
4+
from qsrlib_qsrs.qsr_dyadic_abstractclass import QSR_Dyadic_1t_Abstractclass
5+
6+
7+
class QSR_RA(QSR_Dyadic_1t_Abstractclass):
8+
"""Regional Algebra.
9+
10+
Members:
11+
* _unique_id: "ra"
12+
* _all_possible_relations: ("<", ">", "m", "mi", "o", "oi", "s", "si", "d", "di", "f", "fi", "=")
13+
* _dtype: "bounding_boxes"
14+
15+
Some explanation about the QSR. Maybe a reference if it exists.
16+
"""
17+
18+
_unique_id = "ra"
19+
"""str: Unique identifier name of the QSR."""
20+
21+
_all_possible_relations = ("<", ">", "m", "mi", "o", "oi", "s", "si", "d", "di", "f", "fi", "=")
22+
"""tuple: All possible relations of the QSR."""
23+
24+
_dtype = "bounding_boxes"
25+
"""str: On what kind of data the QSR works with."""
26+
27+
_inverse_map = {"<": ">", "m": "mi", "o": "oi", "s": "si", "d": "di", "f": "fi",
28+
">": "<", "mi": "m", "o1": "o", "si": "s", "di": "d", "fi": "f"}
29+
"""dict: Inverse relations"""
30+
31+
def __init__(self):
32+
"""Constructor.
33+
34+
:return:
35+
"""
36+
super(QSR_RA, self).__init__()
37+
38+
def _compute_qsr(self, bb1, bb2, qsr_params, **kwargs):
39+
"""Compute QSR value.
40+
41+
:param bb1: First object's bounding box.
42+
:type bb2: tuple or list
43+
:param bb2: Second object's bounding box.
44+
:type bb2: tuple or list
45+
:param qsr_params: QSR specific parameters passed in `dynamic_args`.
46+
:type qsr_params: dict
47+
:param kwargs: Optional further arguments.
48+
:return: The computed QSR value: two/three comma separated Allen relations for 2D/3D.
49+
:rtype: str
50+
"""
51+
if len(bb1) == 4 and len(bb2) == 4: # 2D version
52+
return ",".join([self.__allen((bb1[0], bb1[2]), (bb2[0], bb2[2])),
53+
self.__allen((bb1[1], bb1[3]), (bb2[1], bb2[3]))])
54+
elif len(bb1) == 6 and len(bb2) == 6: # 3D version
55+
return ",".join([self.__allen((bb1[0], bb1[3]), (bb2[0], bb2[3])),
56+
self.__allen((bb1[1], bb1[4]), (bb2[1], bb2[4])),
57+
self.__allen((bb1[2], bb1[5]), (bb2[2], bb2[5]))])
58+
else:
59+
raise ValueError("bb1 and bb2 must have length of 4 (2D) or 6 (3D)")
60+
61+
def __allen(self, i1, i2):
62+
if isnan(i1).any() or isnan(i2).any(): # nan values cause dragons
63+
raise ValueError("illegal 'nan' values found")
64+
65+
if i1[1] < i2[0]:
66+
return "<"
67+
if i1[1] == i2[0]:
68+
return "m"
69+
if i1[0] < i2[0] < i1[1] and i2[0] < i1[1] < i2[1]:
70+
return "o"
71+
if i1[0] == i2[0] and i1[1] < i2[1]:
72+
return "s"
73+
if i2[0] < i1[0] < i2[1] and i2[0] < i1[1] < i2[1]:
74+
return "d"
75+
if i2[0] < i1[0] < i2[1] and i1[1] == i2[1]:
76+
return "f"
77+
if i1[0] == i2[0] and i1[1] == i2[1]:
78+
return "="
79+
return self._inverse_map[self.__allen(i2, i1)]

qsr_lib/src/qsrlib_qsrs/qsr_rcc5.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# -*- coding: utf-8 -*-
2+
from __future__ import print_function, division
3+
from qsrlib_qsrs.qsr_rcc_abstractclass import QSR_RCC_Abstractclass
4+
5+
6+
class QSR_RCC5(QSR_RCC_Abstractclass):
7+
"""Computes symmetrical RCC5 relations
8+
9+
"""
10+
11+
_unique_id = "rcc5"
12+
13+
_all_possible_relations = ("dr", "po", "pp", "ppi", "eq")
14+
15+
__mapping_from_rcc8 = {"dc": "dr",
16+
"ec": "dr",
17+
"po": "po",
18+
"tpp": "pp",
19+
"ntpp": "pp",
20+
"tppi": "ppi",
21+
"ntppi": "ppi",
22+
"eq": "eq"}
23+
24+
def __init__(self):
25+
super(QSR_RCC5, self).__init__()
26+
27+
def _convert_to_requested_rcc_type(self, qsr):
28+
return self.__mapping_from_rcc8[qsr]
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
["1.0,o1,o2,{'ra': '>,>'}", "1.0,o2,o1,{'ra': '<,<'}", "2.0,o1,o2,{'ra': '>,mi'}", "2.0,o2,o1,{'ra': '<,m'}", "3.0,o1,o2,{'ra': '>,oi'}", "3.0,o2,o1,{'ra': '<,o'}", "4.0,o1,o2,{'ra': '>,='}", "4.0,o2,o1,{'ra': '<,='}", "5.0,o1,o2,{'ra': '>,o'}", "5.0,o2,o1,{'ra': '<,oi'}", "6.0,o1,o2,{'ra': '>,m'}", "6.0,o2,o1,{'ra': '<,mi'}", "7.0,o1,o2,{'ra': '>,<'}", "7.0,o2,o1,{'ra': '<,>'}", "8.0,o1,o2,{'ra': 'mi,>'}", "8.0,o2,o1,{'ra': 'm,<'}", "9.0,o1,o2,{'ra': 'mi,mi'}", "9.0,o2,o1,{'ra': 'm,m'}", "10.0,o1,o2,{'ra': 'mi,oi'}", "10.0,o2,o1,{'ra': 'm,o'}", "11.0,o1,o2,{'ra': 'mi,='}", "11.0,o2,o1,{'ra': 'm,='}", "12.0,o1,o2,{'ra': 'mi,o'}", "12.0,o2,o1,{'ra': 'm,oi'}", "13.0,o1,o2,{'ra': 'mi,m'}", "13.0,o2,o1,{'ra': 'm,mi'}", "14.0,o1,o2,{'ra': 'mi,<'}", "14.0,o2,o1,{'ra': 'm,>'}", "15.0,o1,o2,{'ra': 'oi,>'}", "15.0,o2,o1,{'ra': 'o,<'}", "16.0,o1,o2,{'ra': 'oi,mi'}", "16.0,o2,o1,{'ra': 'o,m'}", "17.0,o1,o2,{'ra': 'oi,oi'}", "17.0,o2,o1,{'ra': 'o,o'}", "18.0,o1,o2,{'ra': 'oi,='}", "18.0,o2,o1,{'ra': 'o,='}", "19.0,o1,o2,{'ra': 'oi,o'}", "19.0,o2,o1,{'ra': 'o,oi'}", "20.0,o1,o2,{'ra': 'oi,m'}", "20.0,o2,o1,{'ra': 'o,mi'}", "21.0,o1,o2,{'ra': 'oi,<'}", "21.0,o2,o1,{'ra': 'o,>'}", "22.0,o1,o2,{'ra': '=,>'}", "22.0,o2,o1,{'ra': '=,<'}", "23.0,o1,o2,{'ra': '=,mi'}", "23.0,o2,o1,{'ra': '=,m'}", "24.0,o1,o2,{'ra': '=,oi'}", "24.0,o2,o1,{'ra': '=,o'}", "25.0,o1,o2,{'ra': '=,='}", "25.0,o2,o1,{'ra': '=,='}", "26.0,o1,o2,{'ra': '=,o'}", "26.0,o2,o1,{'ra': '=,oi'}", "27.0,o1,o2,{'ra': '=,m'}", "27.0,o2,o1,{'ra': '=,mi'}", "28.0,o1,o2,{'ra': '=,<'}", "28.0,o2,o1,{'ra': '=,>'}", "29.0,o1,o2,{'ra': 'o,>'}", "29.0,o2,o1,{'ra': 'oi,<'}", "30.0,o1,o2,{'ra': 'o,mi'}", "30.0,o2,o1,{'ra': 'oi,m'}", "31.0,o1,o2,{'ra': 'o,oi'}", "31.0,o2,o1,{'ra': 'oi,o'}", "32.0,o1,o2,{'ra': 'o,='}", "32.0,o2,o1,{'ra': 'oi,='}", "33.0,o1,o2,{'ra': 'o,o'}", "33.0,o2,o1,{'ra': 'oi,oi'}", "34.0,o1,o2,{'ra': 'o,m'}", "34.0,o2,o1,{'ra': 'oi,mi'}", "35.0,o1,o2,{'ra': 'o,<'}", "35.0,o2,o1,{'ra': 'oi,>'}", "36.0,o1,o2,{'ra': 'm,>'}", "36.0,o2,o1,{'ra': 'mi,<'}", "37.0,o1,o2,{'ra': 'm,mi'}", "37.0,o2,o1,{'ra': 'mi,m'}", "38.0,o1,o2,{'ra': 'm,oi'}", "38.0,o2,o1,{'ra': 'mi,o'}", "39.0,o1,o2,{'ra': 'm,='}", "39.0,o2,o1,{'ra': 'mi,='}", "40.0,o1,o2,{'ra': 'm,o'}", "40.0,o2,o1,{'ra': 'mi,oi'}", "41.0,o1,o2,{'ra': 'm,m'}", "41.0,o2,o1,{'ra': 'mi,mi'}", "42.0,o1,o2,{'ra': 'm,<'}", "42.0,o2,o1,{'ra': 'mi,>'}", "43.0,o1,o2,{'ra': '<,>'}", "43.0,o2,o1,{'ra': '>,<'}", "44.0,o1,o2,{'ra': '<,mi'}", "44.0,o2,o1,{'ra': '>,m'}", "45.0,o1,o2,{'ra': '<,oi'}", "45.0,o2,o1,{'ra': '>,o'}", "46.0,o1,o2,{'ra': '<,='}", "46.0,o2,o1,{'ra': '>,='}", "47.0,o1,o2,{'ra': '<,o'}", "47.0,o2,o1,{'ra': '>,oi'}", "48.0,o1,o2,{'ra': '<,m'}", "48.0,o2,o1,{'ra': '>,mi'}", "49.0,o1,o2,{'ra': '<,<'}", "49.0,o2,o1,{'ra': '>,>'}"]
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
["1.0,o2,o1,{'ra': '<,<'}", "2.0,o2,o1,{'ra': '<,m'}", "3.0,o2,o1,{'ra': '<,o'}", "4.0,o2,o1,{'ra': '<,='}", "5.0,o2,o1,{'ra': '<,oi'}", "6.0,o2,o1,{'ra': '<,mi'}", "7.0,o2,o1,{'ra': '<,>'}", "8.0,o2,o1,{'ra': 'm,<'}", "9.0,o2,o1,{'ra': 'm,m'}", "10.0,o2,o1,{'ra': 'm,o'}", "11.0,o2,o1,{'ra': 'm,='}", "12.0,o2,o1,{'ra': 'm,oi'}", "13.0,o2,o1,{'ra': 'm,mi'}", "14.0,o2,o1,{'ra': 'm,>'}", "15.0,o2,o1,{'ra': 'o,<'}", "16.0,o2,o1,{'ra': 'o,m'}", "17.0,o2,o1,{'ra': 'o,o'}", "18.0,o2,o1,{'ra': 'o,='}", "19.0,o2,o1,{'ra': 'o,oi'}", "20.0,o2,o1,{'ra': 'o,mi'}", "21.0,o2,o1,{'ra': 'o,>'}", "22.0,o2,o1,{'ra': '=,<'}", "23.0,o2,o1,{'ra': '=,m'}", "24.0,o2,o1,{'ra': '=,o'}", "25.0,o2,o1,{'ra': '=,='}", "26.0,o2,o1,{'ra': '=,oi'}", "27.0,o2,o1,{'ra': '=,mi'}", "28.0,o2,o1,{'ra': '=,>'}", "29.0,o2,o1,{'ra': 'oi,<'}", "30.0,o2,o1,{'ra': 'oi,m'}", "31.0,o2,o1,{'ra': 'oi,o'}", "32.0,o2,o1,{'ra': 'oi,='}", "33.0,o2,o1,{'ra': 'oi,oi'}", "34.0,o2,o1,{'ra': 'oi,mi'}", "35.0,o2,o1,{'ra': 'oi,>'}", "36.0,o2,o1,{'ra': 'mi,<'}", "37.0,o2,o1,{'ra': 'mi,m'}", "38.0,o2,o1,{'ra': 'mi,o'}", "39.0,o2,o1,{'ra': 'mi,='}", "40.0,o2,o1,{'ra': 'mi,oi'}", "41.0,o2,o1,{'ra': 'mi,mi'}", "42.0,o2,o1,{'ra': 'mi,>'}", "43.0,o2,o1,{'ra': '>,<'}", "44.0,o2,o1,{'ra': '>,m'}", "45.0,o2,o1,{'ra': '>,o'}", "46.0,o2,o1,{'ra': '>,='}", "47.0,o2,o1,{'ra': '>,oi'}", "48.0,o2,o1,{'ra': '>,mi'}", "49.0,o2,o1,{'ra': '>,>'}"]
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
["1.0,o1,o2,{'ra': '>,>'}", "2.0,o1,o2,{'ra': '>,mi'}", "3.0,o1,o2,{'ra': '>,oi'}", "4.0,o1,o2,{'ra': '>,='}", "5.0,o1,o2,{'ra': '>,o'}", "6.0,o1,o2,{'ra': '>,m'}", "7.0,o1,o2,{'ra': '>,<'}", "8.0,o1,o2,{'ra': 'mi,>'}", "9.0,o1,o2,{'ra': 'mi,mi'}", "10.0,o1,o2,{'ra': 'mi,oi'}", "11.0,o1,o2,{'ra': 'mi,='}", "12.0,o1,o2,{'ra': 'mi,o'}", "13.0,o1,o2,{'ra': 'mi,m'}", "14.0,o1,o2,{'ra': 'mi,<'}", "15.0,o1,o2,{'ra': 'oi,>'}", "16.0,o1,o2,{'ra': 'oi,mi'}", "17.0,o1,o2,{'ra': 'oi,oi'}", "18.0,o1,o2,{'ra': 'oi,='}", "19.0,o1,o2,{'ra': 'oi,o'}", "20.0,o1,o2,{'ra': 'oi,m'}", "21.0,o1,o2,{'ra': 'oi,<'}", "22.0,o1,o2,{'ra': '=,>'}", "23.0,o1,o2,{'ra': '=,mi'}", "24.0,o1,o2,{'ra': '=,oi'}", "25.0,o1,o2,{'ra': '=,='}", "26.0,o1,o2,{'ra': '=,o'}", "27.0,o1,o2,{'ra': '=,m'}", "28.0,o1,o2,{'ra': '=,<'}", "29.0,o1,o2,{'ra': 'o,>'}", "30.0,o1,o2,{'ra': 'o,mi'}", "31.0,o1,o2,{'ra': 'o,oi'}", "32.0,o1,o2,{'ra': 'o,='}", "33.0,o1,o2,{'ra': 'o,o'}", "34.0,o1,o2,{'ra': 'o,m'}", "35.0,o1,o2,{'ra': 'o,<'}", "36.0,o1,o2,{'ra': 'm,>'}", "37.0,o1,o2,{'ra': 'm,mi'}", "38.0,o1,o2,{'ra': 'm,oi'}", "39.0,o1,o2,{'ra': 'm,='}", "40.0,o1,o2,{'ra': 'm,o'}", "41.0,o1,o2,{'ra': 'm,m'}", "42.0,o1,o2,{'ra': 'm,<'}", "43.0,o1,o2,{'ra': '<,>'}", "44.0,o1,o2,{'ra': '<,mi'}", "45.0,o1,o2,{'ra': '<,oi'}", "46.0,o1,o2,{'ra': '<,='}", "47.0,o1,o2,{'ra': '<,o'}", "48.0,o1,o2,{'ra': '<,m'}", "49.0,o1,o2,{'ra': '<,<'}"]

0 commit comments

Comments
 (0)