fit_primitive.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 import unittest
3 
4 import ensenso_camera.ros2 as ros2py
5 
6 from ensenso_camera_msgs.msg import Primitive
7 
8 from ensenso_camera_test.helper import Point
9 import ensenso_camera_test.ros2_testing as ros2py_testing
10 
11 FitPrimitive = ros2py.import_action("ensenso_camera_msgs", "FitPrimitive")
12 RequestData = ros2py.import_action("ensenso_camera_msgs", "RequestData")
13 
14 INLIER_THRESHOLD = 0.005
15 
16 
17 # All used parameters with a length unit use meters as unit
18 
19 
21  primitive = Primitive()
22  primitive.type = Primitive.CYLINDER
23  primitive.inlier_threshold = INLIER_THRESHOLD
24  primitive.count = 1
25  primitive.inlier_fraction_in = 0.015
26  primitive.min_radius = 0.095
27  primitive.max_radius = 0.105
28  return primitive
29 
30 
32  primitive = Primitive()
33  primitive.type = Primitive.SPHERE
34  primitive.inlier_threshold = INLIER_THRESHOLD
35  primitive.count = 1
36  primitive.inlier_fraction_in = 0.03
37  primitive.min_radius = 0.048
38  primitive.max_radius = 0.055
39  return primitive
40 
41 
43  primitive = Primitive()
44  primitive.type = Primitive.PLANE
45  primitive.inlier_threshold = INLIER_THRESHOLD
46  primitive.count = 1
47  primitive.inlier_fraction_in = 0.015
48  return primitive
49 
50 
51 # Exact values of objects in the test scene
53  def __init__(self):
54  self.center = Point(0, 0.1, -0.1)
55  self.radius = 0.05
56 
57 
59  def __init__(self):
60  self.center = Point(0.0, -0.1, -0.25)
61  self.radius = 0.1
62 
63 
65  def __init__(self):
66  self.normal = Point(0, 0, -1.0)
67  self.center = Point(0, 0, -0.06)
68 
69 
70 class TestFitPrimitive(unittest.TestCase):
71  def setUp(self):
72  self.node = ros2py.create_node("test_fit_primitive")
73  self.fit_primitive_client = ros2py.create_action_client(self.node, "fit_primitive", FitPrimitive)
74  self.request_data_client = ros2py.create_action_client(self.node, "request_data", RequestData)
75 
76  clients = [self.fit_primitive_client, self.request_data_client]
77  success = ros2py.wait_for_servers(self.node, clients, timeout_sec=ros2py_testing.TEST_TIMEOUT, exit=False)
78  self.assertTrue(success, msg="Timeout reached for servers.")
79 
80  request_data_goal = RequestData.Goal()
81  request_data_goal.request_point_cloud = True
82  response = ros2py.send_action_goal(self.node, self.request_data_client, request_data_goal)
83 
84  result = response.get_result()
85  self.assertEqual(result.error.code, 0)
86 
87  def tearDown(self):
88  ros2py.shutdown(self.node)
89 
90  def test_sphere(self):
91  goal = FitPrimitive.Goal()
92  primitive = get_sphere_fit_primitive()
93  goal.primitives.append(primitive)
94  result = self.get_result(goal)
95  self.result_check(result)
96 
97  def test_plane(self):
98  goal = FitPrimitive.Goal()
99  primitive = get_plane_fit_primitive()
100  goal.primitives.append(primitive)
101 
102  result = self.get_result(goal)
103  self.result_check(result)
104 
105  def test_cylinder(self):
106  goal = FitPrimitive.Goal()
107  primitive = get_cylinder_fit_primitive()
108  goal.primitives.append(primitive)
109 
110  result = self.get_result(goal)
111  self.result_check(result)
112 
113  def result_check(self, result):
114  delta = INLIER_THRESHOLD * 2
115  for primitive in result.primitives:
116  if primitive.type == get_sphere_fit_primitive().type:
117  sphere = SphereTestValues()
118  self.assertAlmostEqual(primitive.center.x, sphere.center.x, delta=delta)
119  self.assertAlmostEqual(primitive.center.y, sphere.center.y, delta=delta)
120  self.assertAlmostEqual(primitive.center.z, sphere.center.z, delta=delta)
121  self.assertAlmostEqual(primitive.radius, sphere.radius, delta=delta)
122  elif primitive.type == get_cylinder_fit_primitive().type:
123  cylinder = CylinderTestValues()
124  self.assertAlmostEqual(primitive.center.y, cylinder.center.y, delta=delta)
125  self.assertAlmostEqual(primitive.center.z, cylinder.center.y, delta=delta)
126  self.assertAlmostEqual(primitive.radius, cylinder.radius, delta=delta)
127  elif primitive.type == get_plane_fit_primitive().type:
128  plane = PlaneTestValues()
129  self.assertAlmostEqual(abs(primitive.normal.z), abs(plane.normal.z), delta=delta)
130  self.assertAlmostEqual(primitive.center.z, plane.center.z, delta=delta)
131 
132  def get_result(self, goal):
133  response = ros2py.send_action_goal(self.node, self.fit_primitive_client, goal)
134  self.assertTrue(response.successful(), msg="Fit primitive action has not been successful.")
135  error = response.get_result().error
136  self.assertEqual(error.code, 0, msg=ros2py.format_error(error, note="Fit primitive action exited with error!"))
137  return response.get_result()
138 
139 
140 def main():
141  ros2py_testing.run_ros1_test("test_fit_primitive", TestFitPrimitive)
142 
143 
144 if __name__ == "__main__":
145  main()
ensenso_camera_test.fit_primitive.TestFitPrimitive.node
node
Definition: fit_primitive.py:72
ensenso_camera_test.fit_primitive.SphereTestValues.center
center
Definition: fit_primitive.py:54
ensenso_camera_test.fit_primitive.CylinderTestValues.radius
radius
Definition: fit_primitive.py:61
ensenso_camera_test.fit_primitive.TestFitPrimitive.tearDown
def tearDown(self)
Definition: fit_primitive.py:87
ensenso_camera_test.fit_primitive.TestFitPrimitive.test_sphere
def test_sphere(self)
Definition: fit_primitive.py:90
ensenso_camera_test.fit_primitive.CylinderTestValues.__init__
def __init__(self)
Definition: fit_primitive.py:59
ensenso_camera_test.fit_primitive.PlaneTestValues.center
center
Definition: fit_primitive.py:67
ensenso_camera_test.fit_primitive.TestFitPrimitive.setUp
def setUp(self)
Definition: fit_primitive.py:71
ensenso_camera_test.fit_primitive.TestFitPrimitive.get_result
def get_result(self, goal)
Definition: fit_primitive.py:132
ensenso_camera_test.fit_primitive.PlaneTestValues
Definition: fit_primitive.py:64
ensenso_camera_test.helper
Definition: helper.py:1
ensenso_camera_test.fit_primitive.get_sphere_fit_primitive
def get_sphere_fit_primitive()
Definition: fit_primitive.py:31
ensenso_camera_test.fit_primitive.get_cylinder_fit_primitive
def get_cylinder_fit_primitive()
Definition: fit_primitive.py:20
ensenso_camera_test.fit_primitive.SphereTestValues.radius
radius
Definition: fit_primitive.py:55
ensenso_camera_test.fit_primitive.PlaneTestValues.normal
normal
Definition: fit_primitive.py:66
ensenso_camera_test.fit_primitive.get_plane_fit_primitive
def get_plane_fit_primitive()
Definition: fit_primitive.py:42
ensenso_camera_test.fit_primitive.SphereTestValues
Definition: fit_primitive.py:52
ensenso_camera_test.helper.Point
Definition: helper.py:92
ensenso_camera_test.fit_primitive.TestFitPrimitive.test_plane
def test_plane(self)
Definition: fit_primitive.py:97
ensenso_camera_test.fit_primitive.main
def main()
Definition: fit_primitive.py:140
ensenso_camera_test.fit_primitive.CylinderTestValues
Definition: fit_primitive.py:58
ensenso_camera_test.fit_primitive.CylinderTestValues.center
center
Definition: fit_primitive.py:60
ensenso_camera_test.fit_primitive.SphereTestValues.__init__
def __init__(self)
Definition: fit_primitive.py:53
ensenso_camera_test.fit_primitive.TestFitPrimitive.fit_primitive_client
fit_primitive_client
Definition: fit_primitive.py:73
ensenso_camera_test.fit_primitive.PlaneTestValues.__init__
def __init__(self)
Definition: fit_primitive.py:65
ensenso_camera_test.ros2_testing
Definition: ros2_testing.py:1
ensenso_camera_test.fit_primitive.TestFitPrimitive.result_check
def result_check(self, result)
Definition: fit_primitive.py:113
ensenso_camera_test.fit_primitive.TestFitPrimitive.request_data_client
request_data_client
Definition: fit_primitive.py:74
ensenso_camera_test.fit_primitive.TestFitPrimitive
Definition: fit_primitive.py:70
ensenso_camera_test.fit_primitive.TestFitPrimitive.test_cylinder
def test_cylinder(self)
Definition: fit_primitive.py:105


ensenso_camera_test
Author(s): Ensenso
autogenerated on Wed Apr 2 2025 02:37:52