7 from nav_msgs.msg
import Path
8 from geometry_msgs.msg
import PoseStamped, PolygonStamped, Point
10 from dynamic_reconfigure.server
import Server
as DynamicReconfigureServer
14 rospy.init_node(
"area_to_path_node")
16 self.
path_pub = rospy.Publisher(
"/move_base_simple/waypoints", Path, queue_size=10)
30 rospy.logwarn(
"Send a larger polygon or reduce step size.")
39 p = msg.polygon.points
42 rospy.logwarn(
"Invalid Polygon, path creation requires a 4 vertex square.")
46 x=(p[0].x + p[2].x) / 2,
47 y=(p[0].y + p[2].y) / 2
52 rospy.loginfo(
"Home point set.")
57 psum = math.sqrt(point.x **2 + point.y **2 + point.z **2)
70 pose.pose.position.x = x
71 pose.pose.position.y = y
72 pose.pose.position.z = 0
73 pose.pose.orientation.w = 1.0
77 p = msg.polygon.points
80 rospy.logwarn(
"Invalid Polygon, path creation requires a 4 vertex square.")
86 vec_side_1 = Point(x=p[1].x - p[0].x, y=p[1].y - p[0].y)
87 vec_side_2 = Point(x=p[3].x - p[0].x, y=p[3].y - p[0].y)
90 length_side_1 = math.sqrt(vec_side_1.x**2 + vec_side_1.y**2)
91 length_side_2 = math.sqrt(vec_side_2.x**2 + vec_side_2.y**2)
92 radius = (length_side_1 + length_side_2) / 4
96 x=(p[0].x + p[2].x) / 2,
97 y=(p[0].y + p[2].y) / 2
100 poses.append(self.
get_pose(msg.header, center.x, center.y))
102 angle = math.radians(0)
103 poses.append(self.
get_pose(msg.header,
104 center.x + radius * math.cos(angle),
105 center.y + radius * math.sin(angle)
108 angle = math.radians(60)
109 poses.append(self.
get_pose(msg.header,
110 center.x + radius * math.cos(angle),
111 center.y + radius * math.sin(angle)
114 angle = math.radians(240)
115 poses.append(self.
get_pose(msg.header,
116 center.x + radius * math.cos(angle),
117 center.y + radius * math.sin(angle)
120 angle = math.radians(300)
121 poses.append(self.
get_pose(msg.header,
122 center.x + radius * math.cos(angle),
123 center.y + radius * math.sin(angle)
126 angle = math.radians(120)
127 poses.append(self.
get_pose(msg.header,
128 center.x + radius * math.cos(angle),
129 center.y + radius * math.sin(angle)
132 angle = math.radians(180)
133 poses.append(self.
get_pose(msg.header,
134 center.x + radius * math.cos(angle),
135 center.y + radius * math.sin(angle)
138 poses.append(self.
get_pose(msg.header, center.x, center.y))
146 p = msg.polygon.points
149 rospy.logwarn(
"Invalid Polygon, path creation requires a 4 vertex square.")
155 vec_side_1 = Point(x=p[1].x - p[0].x, y=p[1].y - p[0].y)
156 vec_side_2 = Point(x=p[3].x - p[0].x, y=p[3].y - p[0].y)
159 length_side_1 = math.sqrt(vec_side_1.x**2 + vec_side_1.y**2)
160 length_side_2 = math.sqrt(vec_side_2.x**2 + vec_side_2.y**2)
163 center = Point(x=p[0].x + vec_side_1.x/2 + vec_side_2.x/2, y=p[0].y + vec_side_1.y/2 + vec_side_2.y/2)
166 pos = [center.x, center.y]
170 for step
in itertools.count(start=1, step=1):
171 if self.
step_size * step > max(length_side_1, length_side_2):
175 for _
in range(step):
176 if abs(pos[0] - center.x) <= length_side_1 / 2
and abs(pos[1] - center.y) <= length_side_2 / 2:
181 poses.append(self.
get_pose(msg.header, pos[0], pos[1]))
182 dir = [-dir[1], dir[0]]
191 p = msg.polygon.points
194 rospy.logwarn(
"Invalid Polygon, path creation requires a 4 vertex square.")
200 vec_side_1 = Point(x=p[1].x - p[0].x, y=p[1].y - p[0].y)
201 vec_side_2 = Point(x=p[3].x - p[0].x, y=p[3].y - p[0].y)
204 length_side_1 = math.sqrt(vec_side_1.x**2 + vec_side_1.y**2)
205 length_side_2 = math.sqrt(vec_side_2.x**2 + vec_side_2.y**2)
208 if length_side_1 > length_side_2:
209 vec_step = self.
norm(vec_side_2)
210 vec_side = vec_side_1
211 steps = math.ceil(length_side_2 / self.
step_size)
213 vec_step = self.
norm(vec_side_1)
214 vec_side = vec_side_2
215 steps = math.ceil(length_side_1 / self.
step_size)
220 for i
in range(steps):
225 p[0].x + i * vec_step.x,
226 p[0].y + i * vec_step.y
232 p[0].x + i * vec_step.x + vec_side.x,
233 p[0].y + i * vec_step.y + vec_side.y,
239 p[0].x + i * vec_step.x + vec_side.x,
240 p[0].y + i * vec_step.y + vec_side.y,
246 p[0].x + i * vec_step.x,
247 p[0].y + i * vec_step.y,