From 01cc6ca79b08a77bd4938230d3fa1c7e81303c54 Mon Sep 17 00:00:00 2001
From: Daniel Christoph <daniel.christoph@informatik.hu-berlin.de>
Date: Sun, 26 Jan 2020 15:01:49 +0100
Subject: [PATCH] Update
 src/sim/location_monitor/scripts/location_monitor_node.py

---
 .../scripts/location_monitor_node.py          | 234 ++++++++++++++++++
 1 file changed, 234 insertions(+)
 create mode 100644 src/sim/location_monitor/scripts/location_monitor_node.py

diff --git a/src/sim/location_monitor/scripts/location_monitor_node.py b/src/sim/location_monitor/scripts/location_monitor_node.py
new file mode 100644
index 0000000..f05bdda
--- /dev/null
+++ b/src/sim/location_monitor/scripts/location_monitor_node.py
@@ -0,0 +1,234 @@
+#!/usr/bin/env python
+
+import math
+import rospy
+import re
+import array
+import numpy as np
+from datetime import datetime
+from nav_msgs.msg import Odometry  
+from gazebo_msgs.srv import GetModelState
+from gazebo_msgs.srv import GetWorldProperties 
+
+
+TurtlebotBurger = 0.05
+WriteFlag = 0
+now = datetime.now()
+current_time = now.strftime("%H:%M:%S")
+logtime = str(current_time) + "_log.txt"
+f = open(logtime,"w+")
+# y
+# ^
+# |
+# |  -------          Box muss im rechtem Winkel zur x-Achse sein!
+# |  |     |
+# |  |     |
+# |  -------
+# |
+# ---------------->x
+
+
+
+class Block:
+    def __init__(self, name, relative_entity_name, radius):
+        self._name = name
+        self._relative_entity_name = relative_entity_name
+        self._radius = radius
+
+
+class Tutorial:
+
+    _blockListDict = {
+
+    }
+
+    def show_gazebo_models(self, botx, boty):
+      get_world_properties = rospy.ServiceProxy('/gazebo/get_world_properties', GetWorldProperties)
+      #object_list = list()
+      resp1 = get_world_properties()
+      #print(str(resp1.sim_time))
+      i = 0
+      for model in resp1.model_names:
+        if ("ball" in str(model)) or ("cylinder" in str(model)) or ("box" in str(model) or ("sphere" in str(model))):
+           matches = re.findall(r"[-+]?\d*\.\d+|\d+", str(model))
+           rad = 0
+           if matches:
+             if "box" in str(model):
+              rad = (matches[0])
+              rad = float(rad)/2.0
+             else:
+                rad = (matches[0])
+           s = 'block_' + str(i)
+           self._blockListDict.update( {s : Block(model , 'link' , rad)})
+           i = i+1
+           #print(block)
+      try:
+            global f 
+            global WriteFlag
+            model_coordinates = rospy.ServiceProxy('/gazebo/get_model_state', GetModelState)
+            for block in self._blockListDict.itervalues():
+                blockName = str(block._name)
+                if blockName in resp1.model_names:
+                 resp_coordinates = model_coordinates(blockName, block._relative_entity_name)
+                 l_x = resp_coordinates.pose.position.x
+                 l_y = resp_coordinates.pose.position.y
+                 print(blockName)
+                 if WriteFlag == 0:
+                  f.write(str(blockName) + "\n")
+                 print("X: " + str(l_x))
+                 print("Y: " + str(l_y))
+                 if WriteFlag == 0:
+                  f.write("[T:" + str(resp1.sim_time) + "] " + "Bot X: " + str(l_x) + "\n")
+                  f.write("[T:" + str(resp1.sim_time) + "] " + "Bot Y: " + str(l_y) + "\n")                
+                 dist = distance(botx, boty, l_x, l_y)
+                 safedist = 0
+                 if block._radius != 0:
+                   if "box" in str(blockName):
+                       boxkdetection(float(block._radius), botx, boty, l_x, l_y, resp1.sim_time)
+                   else: 
+                      safedist = float(block._radius) + TurtlebotBurger + 0.05 #Radius/Size + Bot front Rad + 0.05 safe dist
+                      print("Safe " + str(safedist))
+                      if WriteFlag == 0:
+                       f.write("Safedist.: " + str(safedist) + "\n")
+                      print("Dist: " + str(dist))
+                      if WriteFlag == 0:
+                       f.write("[T:" + str(resp1.sim_time) + "] " + "Dist. To Collision Point: " + str(dist) + "\n")
+                      if dist < safedist:                        
+                         rospy.loginfo("Collision!")
+                         if WriteFlag == 0:
+                           f.write("[T:" + str(resp1.sim_time) + "] " + "Collision!")
+                           f.close
+                           WriteFlag = 1
+                 else:
+                   
+                   print("Dist: " + str(dist))
+                   if WriteFlag == 0:
+                    f.write("[T:" + str(resp1.sim_time) + "] " + "Dist: " + str(dist) + "\n")
+
+      except rospy.ServiceException as e:
+             rospy.loginfo("Get Model State service call failed:  {0}".format(e))
+
+
+def distance(x1, y1, x2, y2):
+    #print("bX1: " + str(x1))
+    #print("bY1: " + str(y1))
+    #print("X2: " + str(x2)) 
+    #print("Y2: " + str(y2))
+    dist = math.sqrt((x2 - x1)**2 + (y2 - y1)**2)
+    #print(dist)
+    return dist
+
+
+def boxkdetection(size, botx, boty, l_x, l_y, simtime):
+ global f
+ global WriteFlag
+ if (size*2.0) > 5.0:
+   print("Box to big, > 5m")
+   if WriteFlag == 0:
+      f.write("[T:" + str(simtime) + "] " + "Box Invalid (size > 5m)" + "\n")
+      f.close
+ else:
+  #print("SIZEBOX" + str(size))
+  #cornerdist = (size)/math.sin(math.radians(45))
+  safedist = TurtlebotBurger + 0.05
+  #safedist2 = float(size) + TurtlebotBurger + 0.02
+  if WriteFlag == 0:
+     f.write("Safedist.: " + str(safedist) + "\n")
+  #print("Safe " + str(safedist))
+  #print("Safe2 " + str(safedist2))
+
+  #xUpR = l_x + cornerdist*math.cos(math.radians(45))
+  #yUpR = l_y + cornerdist*math.sin(math.radians(45))
+  #dist1 = distance(botx, boty, xUpR, yUpR)
+
+  #xUpL = l_x + cornerdist * math.cos(math.radians(135))
+  #yUpL = l_y + cornerdist * math.sin(math.radians(135))
+  #dist2 = distance(botx, boty, xUpL, yUpL)
+
+  #xLoL = l_x + cornerdist * math.cos(math.radians(225))
+  #yLoL = l_y + cornerdist * math.sin(math.radians(225))
+  #dist3 = distance(botx, boty, xLoL, yLoL)
+
+  #xLoR = l_x + cornerdist * math.cos(math.radians(315))
+  #yLoR = l_y + cornerdist * math.sin(math.radians(315))
+  #dist4 = distance(botx, boty, xLoR, yLoR)
+
+  #centerdist = distance(botx, boty, l_x, l_y)
+  xR = l_x + size * math.cos(math.radians(0))
+  yL = l_y + size * math.sin(math.radians(0))
+
+  lineA = ((botx,boty), (l_x, l_y))
+  lineB = ((l_x,l_y), (xR,yL))
+
+  angle = angle_between(lineA,lineB)
+  disangle = angle
+  angle1 = angle
+  if angle > 45:
+      disangle = 90 - angle;
+  #print("Angle: " + str(disangle))
+  dis = (size)/math.cos(math.radians(disangle))
+  #print("Dist from center do edge: " + str(dis))
+
+  if botx < l_x and boty > l_y:
+      angle1 = 180 - angle
+  if botx < l_x and boty < l_y:
+      angle1 = 180 + angle
+  if botx > l_x and boty < l_y:
+      angle1 = 360-angle
+  #print("Angle1: " + str(angle1))
+  dynX = l_x + dis * math.cos(math.radians(angle1))
+  dynY = l_y + dis * math.sin(math.radians(angle1))
+  #print("DynX : " + str(dynX))
+  #print("DynY : " + str(dynY))
+  distult = distance(botx, boty, dynX, dynY)
+  if WriteFlag == 0:
+     f.write("[T:" + str(simtime) + "] " + "Dist to collision point: " + str(distult) + "\n")
+  print("Dist to collision point: " + str(distult))
+  if distult < safedist:
+      rospy.loginfo("Collision!")
+      if WriteFlag == 0:
+          f.write("[T:" + str(simtime) + "] " + "Collision!")
+          f.close
+          WriteFlag = 1
+
+
+    
+def slope(x1, y1, x2, y2): # Line slope given two points:
+    return (y2-y1)/(x2-x1)
+
+def angle(s1, s2):
+    return math.degrees(math.atan((s2-s1)/(1+(s2*s1))))
+
+def angle_between(lineA, lineB):
+    slope1 = slope(lineA[0][0], lineA[0][1], lineA[1][0], lineA[1][1])
+    slope2 = slope(lineB[0][0], lineB[0][1], lineB[1][0], lineB[1][1])
+
+    ang = angle(slope1, slope2)
+    if ang < 0:
+        ang = ang *(-1.0)
+
+    return ang
+
+
+def callback(msg):
+    global WriteFlag
+    botx = msg.pose.pose.position.x
+    boty = msg.pose.pose.position.y  
+    print("BotX: " + str(botx))
+    print("BotY: " + str(boty))
+    if botx > 0 and boty > 0:
+       tuto = Tutorial()
+       tuto.show_gazebo_models(botx, boty)
+    else:
+        rospy.loginfo("Bot out of tracking Range!((x,y)<0)")
+        if WriteFlag == 0:
+            f.write("Bot out of tracking Range!((x,y)<0)")
+            f.close
+
+def main():
+    rospy.init_node('location_monitor')
+    rospy.Subscriber("/odom", Odometry, callback)
+    rospy.spin()
+
+if __name__ == '__main__':
+   main()
-- 
GitLab