functions.py
Go to the documentation of this file.
1 import rospy
2 import tf
3 from numpy import array
4 import actionlib
5 from move_base_msgs.msg import MoveBaseAction, MoveBaseGoal
6 from nav_msgs.srv import GetPlan
7 from geometry_msgs.msg import PoseStamped
8 from numpy import floor
9 from numpy.linalg import norm
10 from numpy import inf
11 #________________________________________________________________________________
12 class robot:
13  goal = MoveBaseGoal()
14  start = PoseStamped()
15  end = PoseStamped()
16 
17  def __init__(self,name):
19  self.name=name
20  self.global_frame=rospy.get_param('~global_frame','/map')
22  self.listener.waitForTransform(self.global_frame, name+'/base_link', rospy.Time(0),rospy.Duration(10.0))
23  cond=0;
24  while cond==0:
25  try:
26  (trans,rot) = self.listener.lookupTransform(self.global_frame, self.name+'/base_link', rospy.Time(0))
27  cond=1
29  cond==0
30  self.position=array([trans[0],trans[1]])
31  self.assigned_point=self.position
32  self.client=actionlib.SimpleActionClient(self.name+'/move_base', MoveBaseAction)
33  self.client.wait_for_server()
34  robot.goal.target_pose.header.frame_id=self.global_frame
35  robot.goal.target_pose.header.stamp=rospy.Time.now()
36 
37  rospy.wait_for_service(self.name+'/move_base_node/NavfnROS/make_plan')
38  self.make_plan = rospy.ServiceProxy(self.name+'/move_base_node/NavfnROS/make_plan', GetPlan)
39  robot.start.header.frame_id=self.global_frame
40  robot.end.header.frame_id=self.global_frame
41 
42  def getPosition(self):
43  cond=0;
44  while cond==0:
45  try:
46  (trans,rot) = self.listener.lookupTransform(self.global_frame, self.name+'/base_link', rospy.Time(0))
47  cond=1
49  cond==0
50  self.position=array([trans[0],trans[1]])
51  return self.position
52 
53  def sendGoal(self,point):
54  robot.goal.target_pose.pose.position.x=point[0]
55  robot.goal.target_pose.pose.position.y=point[1]
56  robot.goal.target_pose.pose.orientation.w = 1.0
57  self.client.send_goal(robot.goal)
58  self.assigned_point=array(point)
59 
60  def cancelGoal(self):
61  self.client.cancel_goal()
62  self.assigned_point=self.getPosition()
63 
64  def getState(self):
65  return self.client.get_state()
66 
67  def makePlan(self,start,end):
68  robot.start.pose.position.x=start[0]
69  robot.start.pose.position.y=start[1]
70  robot.end.pose.position.x=end[0]
71  robot.end.pose.position.y=end[1]
72  start=self.listener.transformPose(self.name+'/map', robot.start)
73  end=self.listener.transformPose(self.name+'/map', robot.end)
74  plan=self.make_plan(start = start, goal = end, tolerance = 0.0)
75  return plan.plan.poses
76 #________________________________________________________________________________
77 
78 def index_of_point(mapData,Xp):
79  resolution=mapData.info.resolution
80  Xstartx=mapData.info.origin.position.x
81  Xstarty=mapData.info.origin.position.y
82  width=mapData.info.width
83  Data=mapData.data
84  index=int( ( floor((Xp[1]-Xstarty)/resolution)*width)+( floor((Xp[0]-Xstartx)/resolution) ))
85  return index
86 
87 def point_of_index(mapData,i):
88  y=mapData.info.origin.position.y+(i/mapData.info.width)*mapData.info.resolution
89  x=mapData.info.origin.position.x+(i-(i/mapData.info.width)*(mapData.info.width))*mapData.info.resolution
90  return array([x,y])
91 #________________________________________________________________________________
92 
93 def informationGain(mapData,point,r):
94  infoGain=0;
95  index=index_of_point(mapData,point)
96  r_region=int(r/mapData.info.resolution)
97  init_index=index-r_region*(mapData.info.width+1)
98  for n in range(0,2*r_region+1):
99  start=n*mapData.info.width+init_index
100  end=start+2*r_region
101  limit=((start/mapData.info.width)+2)*mapData.info.width
102  for i in range(start,end+1):
103  if (i>=0 and i<limit and i<len(mapData.data)):
104  if(mapData.data[i]==-1 and norm(array(point)-point_of_index(mapData,i))<=r):
105  infoGain+=1
106  return infoGain*(mapData.info.resolution**2)
107 #________________________________________________________________________________
108 
109 def discount(mapData,assigned_pt,centroids,infoGain,r):
110  index=index_of_point(mapData,assigned_pt)
111  r_region=int(r/mapData.info.resolution)
112  init_index=index-r_region*(mapData.info.width+1)
113  for n in range(0,2*r_region+1):
114  start=n*mapData.info.width+init_index
115  end=start+2*r_region
116  limit=((start/mapData.info.width)+2)*mapData.info.width
117  for i in range(start,end+1):
118  if (i>=0 and i<limit and i<len(mapData.data)):
119  for j in range(0,len(centroids)):
120  current_pt=centroids[j]
121  if(mapData.data[i]==-1 and norm(point_of_index(mapData,i)-current_pt)<=r and norm(point_of_index(mapData,i)-assigned_pt)<=r):
122  infoGain[j]-=1 #this should be modified, subtract the area of a cell, not 1
123  return infoGain
124 #________________________________________________________________________________
125 
126 def pathCost(path):
127  if (len(path)>0):
128  i=len(path)/2
129  p1=array([path[i-1].pose.position.x,path[i-1].pose.position.y])
130  p2=array([path[i].pose.position.x,path[i].pose.position.y])
131  return norm(p1-p2)*(len(path)-1)
132  else:
133  return inf
134 #________________________________________________________________________________
135 
136 def unvalid(mapData,pt):
137  index=index_of_point(mapData,pt)
138  r_region=5
139  init_index=index-r_region*(mapData.info.width+1)
140  for n in range(0,2*r_region+1):
141  start=n*mapData.info.width+init_index
142  end=start+2*r_region
143  limit=((start/mapData.info.width)+2)*mapData.info.width
144  for i in range(start,end+1):
145  if (i>=0 and i<limit and i<len(mapData.data)):
146  if(mapData.data[i]==1):
147  return True
148  return False
149 #________________________________________________________________________________
150 def Nearest(V,x):
151  n=inf
152  i=0
153  for i in range(0,V.shape[0]):
154  n1=norm(V[i,:]-x)
155  if (n1<n):
156  n=n1
157  result=i
158  return result
159 
160 #________________________________________________________________________________
161 def Nearest2(V,x):
162  n=inf
163  result=0
164  for i in range(0,len(V)):
165  n1=norm(V[i]-x)
166 
167  if (n1<n):
168  n=n1
169  return i
170 #________________________________________________________________________________
171 def gridValue(mapData,Xp):
172  resolution=mapData.info.resolution
173  Xstartx=mapData.info.origin.position.x
174  Xstarty=mapData.info.origin.position.y
175 
176  width=mapData.info.width
177  Data=mapData.data
178  # returns grid value at "Xp" location
179  #map data: 100 occupied -1 unknown 0 free
180  index=( floor((Xp[1]-Xstarty)/resolution)*width)+( floor((Xp[0]-Xstartx)/resolution) )
181 
182  if int(index) < len(Data):
183  return Data[int(index)]
184  else:
185  return 100
186 
187 
188 
189 
190 
191 
192 
193 
194 
195 
196 
197 
198 
199 
200 
201 
202 
203 
204 
205 
206 
207 
208 
209 
210 
211 
212 
213 
214 
215 
216 
217 
218 
219 
220 
221 
def Nearest2(V, x)
Definition: functions.py:161
def Nearest(V, x)
Definition: functions.py:150
def discount(mapData, assigned_pt, centroids, infoGain, r)
Definition: functions.py:109
def makePlan(self, start, end)
Definition: functions.py:67
def getState(self)
Definition: functions.py:64
def pathCost(path)
Definition: functions.py:126
def getPosition(self)
Definition: functions.py:42
def point_of_index(mapData, i)
Definition: functions.py:87
def informationGain(mapData, point, r)
Definition: functions.py:93
def __init__(self, name)
Definition: functions.py:17
def index_of_point(mapData, Xp)
Definition: functions.py:78
def cancelGoal(self)
Definition: functions.py:60
def sendGoal(self, point)
Definition: functions.py:53
def unvalid(mapData, pt)
Definition: functions.py:136
def gridValue(mapData, Xp)
Definition: functions.py:171


rrt_exploration
Author(s): Hassan Umari
autogenerated on Mon Jun 10 2019 14:57:44