fit_primitive.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 import rospy
3 import rostest
4 
5 import unittest
6 
7 import actionlib
8 import numpy as np
9 from actionlib_msgs.msg import GoalStatus
10 from ensenso_camera_msgs.msg import FitPrimitiveAction, FitPrimitiveGoal, Primitive
11 from ensenso_camera_msgs.msg import RequestDataAction, RequestDataGoal
12 
13 from helper import Point
14 
15 
16 # All used parameters with a length unit use meters as unit
17 
18 # Input parameters for "fit_primitive" action
20  primitive = Primitive()
21  primitive.type = Primitive.CYLINDER
22  primitive.inlier_threshold = 0.001
23  primitive.count = 1
24  primitive.inlier_fraction_in = 0.015
25  primitive.min_radius = 0.095
26  primitive.max_radius = 0.105
27  return primitive
28 
29 
31  primitive = Primitive()
32  primitive.type = Primitive.SPHERE
33  primitive.inlier_threshold = 0.001
34  primitive.count = 1
35  primitive.inlier_fraction_in = 0.03
36  primitive.min_radius = 0.048
37  primitive.max_radius = 0.055
38  return primitive
39 
40 
42  primitive = Primitive()
43  primitive.type = Primitive.PLANE
44  primitive.inlier_threshold = 0.001
45  primitive.count = 1
46  primitive.inlier_fraction_in = 0.015
47  primitive.min_radius = 0.095
48  primitive.max_radius = 0.105
49  return primitive
50 
51 
52 # Exact values of objects in the test scene
54  def __init__(self):
55  self.center = Point(0, 0.1, -0.1)
56  self.radius = 0.05
57 
58 
60  def __init__(self):
61  self.center = Point(0.0, -0.1, -0.25)
62  self.radius = 0.1
63 
64 
66  def __init__(self):
67  self.normal = Point(0, 0, -1.0)
68  self.center = Point(0, 0, -0.06)
69 
70 
71 class TestFitPrimitive(unittest.TestCase):
72  def setUp(self):
73  self.fit_primitive_client = actionlib.SimpleActionClient("fit_primitive", FitPrimitiveAction)
74  self.fit_primitive_client.wait_for_server()
75 
76  self.request_data_client = actionlib.SimpleActionClient("request_data", RequestDataAction)
77  self.request_data_client.wait_for_server()
78 
79  request_data_goal = RequestDataGoal()
80  request_data_goal.request_point_cloud = True
81  self.request_data_client.send_goal(request_data_goal)
82  self.request_data_client.wait_for_result()
83 
84  result = self.request_data_client.get_result()
85  self.assertEqual(result.error.code, 0)
86 
87  def test_sphere(self):
88  goal = FitPrimitiveGoal()
89  primitive = get_sphere_fit_primitive()
90  goal.primitives.append(primitive)
91 
92  result = self.get_result(goal)
93  self.result_check(result)
94 
95  def test_plane(self):
96  goal = FitPrimitiveGoal()
97  primitive = get_plane_fit_primitive()
98  goal.primitives.append(primitive)
99 
100  result = self.get_result(goal)
101  self.result_check(result)
102 
103  def test_cylinder(self):
104  goal = FitPrimitiveGoal()
105  primitive = get_cylinder_fit_primitive()
106  goal.primitives.append(primitive)
107 
108  result = self.get_result(goal)
109  self.result_check(result)
110 
112  goal = FitPrimitiveGoal()
113 
114  goal.primitives.append(get_sphere_fit_primitive())
115  goal.primitives.append(get_cylinder_fit_primitive())
116  goal.primitives.append(get_plane_fit_primitive())
117 
118  result = self.get_result(goal)
119  self.result_check(result)
120 
122  goal = FitPrimitiveGoal()
123  primitive = get_plane_fit_primitive()
124  primitive.count = 3
125  goal.primitives.append(primitive)
126 
127  result = self.get_result(goal)
128  self.result_check(result)
129 
130  def result_check(self, result):
131  delta = 0.005
132  for primitive in result.primitives:
133  if primitive.type == get_sphere_fit_primitive().type:
134  sphere = SphereTestValues()
135  self.assertAlmostEqual(primitive.center.x, sphere.center.x, delta=delta)
136  self.assertAlmostEqual(primitive.center.y, sphere.center.y, delta=delta)
137  self.assertAlmostEqual(primitive.center.z, sphere.center.z, delta=delta)
138  self.assertAlmostEqual(primitive.radius, sphere.radius, delta=delta)
139  elif primitive.type == get_cylinder_fit_primitive().type:
140  cylinder = CylinderTestValues()
141  self.assertAlmostEqual(primitive.center.y, cylinder.center.y, delta=delta)
142  self.assertAlmostEqual(primitive.center.z, cylinder.center.y, delta=delta)
143  self.assertAlmostEqual(primitive.radius, cylinder.radius, delta=delta)
144  elif primitive.type == get_plane_fit_primitive().type:
145  plane = PlaneTestValues()
146  self.assertAlmostEqual(primitive.normal.z, plane.normal.z, delta=delta)
147  self.assertAlmostEqual(primitive.center.z, plane.center.z, delta=delta)
148 
149  def get_result(self, goal):
150  self.fit_primitive_client.send_goal(goal)
151  self.fit_primitive_client.wait_for_result()
152  self.assertEqual(self.fit_primitive_client.get_state(), GoalStatus.SUCCEEDED)
153  result = self.fit_primitive_client.get_result()
154  self.assertEqual(result.error.code, 0)
155  return result
156 
157 
158 if __name__ == "__main__":
159  try:
160  rospy.init_node("test_fit_primitive")
161  rostest.rosrun("ensenso_camera_test", "test_fit_primitive", TestFitPrimitive)
162  except rospy.ROSInterruptException:
163  pass
def get_cylinder_fit_primitive()
def get_plane_fit_primitive()
def get_sphere_fit_primitive()
def result_check(self, result)


ensenso_camera_test
Author(s): Ensenso
autogenerated on Thu May 16 2019 02:44:26