From 81667c67d932997b93d9e3d71e8673f540b25fd3 Mon Sep 17 00:00:00 2001
From: pateman16 <patrickkarlsson16@gmail.com>
Date: Tue, 1 May 2018 09:44:20 +0200
Subject: [PATCH] minor

---
 action/gotoposition_sensor.action             |   8 ++
 ...utonomous_offboard_coverage_descend.launch |   9 ++
 .../autonomous_offboard_gotopos_sensor.launch |   6 +
 .../autonomous_offboard_vel_square.launch     |   6 +
 .../action_controllerGotopos_sensor.py        |  37 ++++++
 .../action_controller_coverage_descend.py     | 107 ++++++++++++++++++
 src/scripts/action_controller_pid_square.py   |  63 +++++++++++
 src/scripts/gotoposition_sensor_server.py     |  94 +++++++++++++++
 src/scripts/object-detection.pbtxt            |   8 ++
 src/scripts/object_detection/__init__.pyc     | Bin 0 -> 174 bytes
 .../object_detection/core/__init__.pyc        | Bin 0 -> 179 bytes
 .../object_detection/core/standard_fields.pyc | Bin 0 -> 9726 bytes
 .../object_detection/protos/__init__.pyc      | Bin 0 -> 181 bytes
 .../protos/string_int_label_map_pb2.pyc       | Bin 0 -> 3615 bytes
 .../object_detection/utils/__init__.pyc       | Bin 0 -> 180 bytes
 .../object_detection/utils/label_map_util.pyc | Bin 0 -> 6552 bytes
 .../utils/visualization_utils.pyc             | Bin 0 -> 24963 bytes
 src/scripts/stuff/__init__.pyc                | Bin 0 -> 163 bytes
 src/scripts/stuff/helper.pyc                  | Bin 0 -> 9279 bytes
 19 files changed, 338 insertions(+)
 create mode 100755 action/gotoposition_sensor.action
 create mode 100644 src/launch/autonomous_offboard_coverage_descend.launch
 create mode 100644 src/launch/autonomous_offboard_gotopos_sensor.launch
 create mode 100644 src/launch/autonomous_offboard_vel_square.launch
 create mode 100755 src/scripts/action_controllerGotopos_sensor.py
 create mode 100755 src/scripts/action_controller_coverage_descend.py
 create mode 100755 src/scripts/action_controller_pid_square.py
 create mode 100755 src/scripts/gotoposition_sensor_server.py
 create mode 100755 src/scripts/object-detection.pbtxt
 create mode 100644 src/scripts/object_detection/__init__.pyc
 create mode 100644 src/scripts/object_detection/core/__init__.pyc
 create mode 100644 src/scripts/object_detection/core/standard_fields.pyc
 create mode 100644 src/scripts/object_detection/protos/__init__.pyc
 create mode 100644 src/scripts/object_detection/protos/string_int_label_map_pb2.pyc
 create mode 100644 src/scripts/object_detection/utils/__init__.pyc
 create mode 100644 src/scripts/object_detection/utils/label_map_util.pyc
 create mode 100644 src/scripts/object_detection/utils/visualization_utils.pyc
 create mode 100644 src/scripts/stuff/__init__.pyc
 create mode 100644 src/scripts/stuff/helper.pyc

diff --git a/action/gotoposition_sensor.action b/action/gotoposition_sensor.action
new file mode 100755
index 0000000..cacbd29
--- /dev/null
+++ b/action/gotoposition_sensor.action
@@ -0,0 +1,8 @@
+#goal definition
+geometry_msgs/PoseStamped destination
+---
+#result definition
+std_msgs/String data
+---
+#feedback
+geometry_msgs/PoseStamped current_position
diff --git a/src/launch/autonomous_offboard_coverage_descend.launch b/src/launch/autonomous_offboard_coverage_descend.launch
new file mode 100644
index 0000000..8be0a7c
--- /dev/null
+++ b/src/launch/autonomous_offboard_coverage_descend.launch
@@ -0,0 +1,9 @@
+<launch>
+  <node name="position_control" pkg="autonomous_offboard" type="position_control.py" output="screen" />
+  <node name="action_controller_coverage_descend" pkg="autonomous_offboard" type="action_controller_coverage_descend.py" output="screen" />
+  <node name="goto_position_server" pkg="autonomous_offboard" type="goto_position_server.py" output="screen" />
+  <node name="goto_position_vel_server" pkg="autonomous_offboard" type="goto_position_vel_server.py" output="screen" />
+  <node name="tensorflow_detection" pkg="autonomous_offboard" type="tensorflow_hw_mvBlueFox_detection.py" output="screen" />
+  <node name="descend_on_object_server" pkg="autonomous_offboard" type="descend_on_object_server.py" output="screen" />
+  <node name="obstacle_detection_control" pkg="autonomous_offobard" type="obstacle_detection_control.py" output="screen" />
+</launch>
diff --git a/src/launch/autonomous_offboard_gotopos_sensor.launch b/src/launch/autonomous_offboard_gotopos_sensor.launch
new file mode 100644
index 0000000..7a9b4f9
--- /dev/null
+++ b/src/launch/autonomous_offboard_gotopos_sensor.launch
@@ -0,0 +1,6 @@
+<launch>
+  <node name="position_control" pkg="autonomous_offboard" type="position_control.py" output="screen" />
+  <node name="action_controllerGotopos_sensor" pkg="autonomous_offboard" type="action_controllerGotopos_sensor.py" output="screen" />
+  <node name="goto_position_server" pkg="autonomous_offboard" type="goto_position_server.py" output="screen" />
+  <node name="gotoposition_sensor_server" pkg="autonomous_offboard" type="gotoposition_sensor_server.py" output="screen" />
+</launch>
diff --git a/src/launch/autonomous_offboard_vel_square.launch b/src/launch/autonomous_offboard_vel_square.launch
new file mode 100644
index 0000000..9602a07
--- /dev/null
+++ b/src/launch/autonomous_offboard_vel_square.launch
@@ -0,0 +1,6 @@
+<launch>
+  <node name="position_control" pkg="autonomous_offboard" type="position_control.py" output="screen" />
+  <node name="action_controller_pid_square" pkg="autonomous_offboard" type="action_controller_pid_square.py" output="screen" />
+  <node name="goto_position_server" pkg="autonomous_offboard" type="goto_position_server.py" output="screen" />
+  <node name="goto_position_vel_server" pkg="autonomous_offboard" type="goto_position_vel_server.py" output="screen" />
+</launch>
diff --git a/src/scripts/action_controllerGotopos_sensor.py b/src/scripts/action_controllerGotopos_sensor.py
new file mode 100755
index 0000000..5a7ee96
--- /dev/null
+++ b/src/scripts/action_controllerGotopos_sensor.py
@@ -0,0 +1,37 @@
+#!/usr/bin/env python
+import roslib
+#roslib.load_manifest('autonomous_offboard')
+import rospy
+import actionlib
+import mavros_state
+import time
+
+from autonomous_offboard.msg import center_on_objectAction,  center_on_objectGoal, descend_on_objectAction, descend_on_objectGoal, detect_objectAction, detect_objectGoal,goto_position_velAction, goto_position_velGoal, goto_positionAction, goto_positionGoal, short_grippersAction, short_grippersGoal, long_grippersAction, long_grippersGoal, coverageAction, coverageGoal, gotoposition_sensorAction , gotoposition_sensorGoal
+
+from std_msgs.msg import Float32
+from geometry_msgs.msg import PoseStamped
+
+if __name__ == '__main__':
+    rospy.init_node('action_controllerGotopos_sensor')
+    gotoposition_sensor_client = actionlib.SimpleActionClient('gotoposition_sensor', gotoposition_sensorAction)
+    gotoposition_sensor_client.wait_for_server()
+    gotoposition_sensor_goal = gotoposition_sensorGoal()
+    mv_state = mavros_state.mavros_state()
+    print 'Setting offboard'
+    mv_state.set_mode('OFFBOARD')
+    print 'Arming vehicle'
+    mv_state.arm(True)
+    rospy.loginfo("Taking off")
+    time.sleep(10)
+
+    rospy.loginfo("First position")
+    gotoposition_sensor_goal.destination.pose.position.x = 2
+    gotoposition_sensor_goal.destination.pose.position.y = 0
+    gotoposition_sensor_goal.destination.pose.position.z = 3
+    gotoposition_sensor_client.send_goal(gotoposition_sensor_goal)
+    gotoposition_sensor_client.wait_for_result()
+
+
+    time.sleep(10)
+
+    mv_state.land(0.0)
diff --git a/src/scripts/action_controller_coverage_descend.py b/src/scripts/action_controller_coverage_descend.py
new file mode 100755
index 0000000..2709bb5
--- /dev/null
+++ b/src/scripts/action_controller_coverage_descend.py
@@ -0,0 +1,107 @@
+#!/usr/bin/env python
+
+import roslib
+#roslib.load_manifest('autonomous_offboard')
+import rospy
+import actionlib
+import mavros_state
+import time
+
+from autonomous_offboard.msg import center_on_objectAction,  center_on_objectGoal, descend_on_objectAction, descend_on_objectGoal, detect_objectAction, detect_objectGoal,goto_position_velAction, goto_position_velGoal, goto_positionAction, goto_positionGoal, short_grippersAction, short_grippersGoal, long_grippersAction, long_grippersGoal, coverageAction, coverageGoal
+
+from std_msgs.msg import Float32
+from geometry_msgs.msg import PoseStamped
+
+if __name__ == '__main__':
+    rospy.init_node('action_controller_coverage_descend')
+    goto_position_vel_client = actionlib.SimpleActionClient('goto_position_vel', goto_position_velAction)
+    goto_position_vel_client.wait_for_server()
+    goto_position_vel_goal = goto_position_velGoal()
+    mv_state = mavros_state.mavros_state()
+    print 'Setting offboard'
+    mv_state.set_mode('OFFBOARD')
+    print 'Arming vehicle'
+    mv_state.arm(True)
+    rospy.loginfo("Taking off")
+    time.sleep(10)
+
+    coverage_client = actionlib.SimpleActionClient('coverage', coverageAction)
+    coverage_client.wait_for_server()
+    coverage_goal = coverageGoal()
+    coverage_goal.destination.pose.position.x = 5
+    coverage_goal.destination.pose.position.y = 0
+    coverage_goal.destination.pose.position.z = 5
+    coverage_client.send_goal(coverage_goal)
+    coverage_client.wait_for_result()
+    res = PoseStamped()
+    res = coverage_client.get_result().detected_object_pos
+    rospy.loginfo("Detected object is at position (x,y,z)=({}, {}, {})".format(
+        res.pose.position.x,
+        res.pose.position.y,
+        res.pose.position.z))
+    if res.pose.position.x == float("inf"):
+        rospy.loginfo("ABORT no object detected. going home")
+        mv_state.land(0.0)
+        mv_state.arm(False)
+    else:
+        rospy.loginfo("Going to detected position")
+        goto_position_vel_goal.destination.pose.position.x = coverage_client.get_result().detected_object_pos.pose.position.x
+        goto_position_vel_goal.destination.pose.position.y = coverage_client.get_result().detected_object_pos.pose.position.y
+        goto_position_vel_goal.destination.pose.position.z = coverage_client.get_result().detected_object_pos.pose.position.z
+        goto_position_vel_client.send_goal(goto_position_goal)
+        goto_position_vel_client.wait_for_result()
+        rospy.loginfo("Is at position (x,y,z)=({}, {}, {})".format(coverage_client.get_result().detected_object_pos.pose.position.x,
+                                                                   coverage_client.get_result().detected_object_pos.pose.position.y,
+                                                                   coverage_client.get_result().detected_object_pos.pose.position.z))
+
+        rospy.loginfo("Descending on object")
+        descend_on_object_client = actionlib.SimpleActionClient('descend_on_object', descend_on_objectAction)
+        descend_on_object_client.wait_for_server()
+        rospy.loginfo("Descending server started")
+        descend_on_object_goal = descend_on_objectGoal()
+        descend_on_objectGoal = 2.0
+        descend_on_object_client.send_goal(descend_on_object_goal)
+        descend_on_object_client.wait_for_result()
+        if descend_on_object_client.get_result().position_reached.data:
+            print("landing")
+            mv_state.arm(False)
+        else:
+            rospy.loginfo("Couldnt land exiting")
+
+        time.sleep(3)
+
+        print 'Setting offboard'
+        mv_state.set_mode('OFFBOARD')
+        print 'Arming vehicle'
+        mv_state.arm(True)
+
+        time.sleep(5)
+
+        rospy.loginfo("Takeoff")
+        goto_position_goal.destination.pose.position.x = 0
+        goto_position_goal.destination.pose.position.y = 0
+        goto_position_goal.destination.pose.position.z = 3
+        goto_position_client.send_goal(goto_position_goal)
+        goto_position_client.wait_for_result()
+
+        time.sleep(5)
+
+        rospy.loginfo("Going Home")
+        goto_position_goal.destination.pose.position.x = -5
+        goto_position_goal.destination.pose.position.y = 0
+        goto_position_goal.destination.pose.position.z = 3
+        goto_position_client.send_goal(goto_position_goal)
+        goto_position_client.wait_for_result()
+
+        time.sleep(5)
+
+        rospy.loginfo("Landing")
+        goto_position_vel_goal.destination.pose.position.x = 0
+        goto_position_vel_goal.destination.pose.position.y = 0
+        goto_position_vel_goal.destination.pose.position.z = -0.1
+        goto_position_vel_client.send_goal(goto_position_vel_goal)
+        goto_position_vel_client.wait_for_result()
+        rospy.loginfo("Trying to land, 10 second sleep")
+        time.sleep(10)
+
+        mv_state.arm(False)
diff --git a/src/scripts/action_controller_pid_square.py b/src/scripts/action_controller_pid_square.py
new file mode 100755
index 0000000..c66f2c6
--- /dev/null
+++ b/src/scripts/action_controller_pid_square.py
@@ -0,0 +1,63 @@
+#!/usr/bin/env python
+import roslib
+#roslib.load_manifest('autonomous_offboard')
+import rospy
+import actionlib
+import mavros_state
+import time
+
+from autonomous_offboard.msg import center_on_objectAction,  center_on_objectGoal, descend_on_objectAction, descend_on_objectGoal, detect_objectAction, detect_objectGoal,goto_position_velAction, goto_position_velGoal, goto_positionAction, goto_positionGoal, short_grippersAction, short_grippersGoal, long_grippersAction, long_grippersGoal, coverageAction, coverageGoal
+
+from std_msgs.msg import Float32
+from geometry_msgs.msg import PoseStamped
+
+if __name__ == '__main__':
+    rospy.init_node('action_controller_pid_square')
+    goto_position_vel_client = actionlib.SimpleActionClient('goto_position_vel', goto_position_velAction)
+    goto_position_vel_client.wait_for_server()
+    goto_position_vel_goal = goto_position_velGoal()
+    mv_state = mavros_state.mavros_state()
+    print 'Setting offboard'
+    mv_state.set_mode('OFFBOARD')
+    print 'Arming vehicle'
+    mv_state.arm(True)
+    rospy.loginfo("Taking off")
+    time.sleep(10)
+
+    rospy.loginfo("First position")
+    goto_position_vel_goal.destination.pose.position.x = 5
+    goto_position_vel_goal.destination.pose.position.y = 0
+    goto_position_vel_goal.destination.pose.position.z = 3
+    goto_position_vel_client.send_goal(goto_position_vel_goal)
+    goto_position_vel_client.wait_for_result()
+
+    time.sleep(10)
+
+    rospy.loginfo("Second position")
+    goto_position_vel_goal.destination.pose.position.x = 0
+    goto_position_vel_goal.destination.pose.position.y = -5
+    goto_position_vel_goal.destination.pose.position.z = 3
+    goto_position_vel_client.send_goal(goto_position_vel_goal)
+    goto_position_vel_client.wait_for_result()
+
+    time.sleep(10)
+
+    rospy.loginfo("Third position")
+    goto_position_vel_goal.destination.pose.position.x = -5
+    goto_position_vel_goal.destination.pose.position.y = 0
+    goto_position_vel_goal.destination.pose.position.z = 3
+    goto_position_vel_client.send_goal(goto_position_vel_goal)
+    goto_position_vel_client.wait_for_result()
+
+    time.sleep(10)
+
+    rospy.loginfo("Fourth position")
+    goto_position_vel_goal.destination.pose.position.x = 0
+    goto_position_vel_goal.destination.pose.position.y = 5
+    goto_position_vel_goal.destination.pose.position.z = 3
+    goto_position_vel_client.send_goal(goto_position_vel_goal)
+    goto_position_vel_client.wait_for_result()
+
+    time.sleep(10)
+
+    mv_state.land(0.0)
diff --git a/src/scripts/gotoposition_sensor_server.py b/src/scripts/gotoposition_sensor_server.py
new file mode 100755
index 0000000..213939b
--- /dev/null
+++ b/src/scripts/gotoposition_sensor_server.py
@@ -0,0 +1,94 @@
+#!/usr/bin/env python
+import rospy
+import actionlib
+import math
+import tf
+import numpy
+import time
+import autonomous_offboard.msg
+from std_msgs.msg import Bool, String, Float32, Float64
+from geometry_msgs.msg import PoseStamped, Quaternion
+
+
+
+
+
+
+class gotoposition_sensor_server():
+    def __init__(self):
+
+        #---------------Variables---------------#
+
+        self.local_pose = PoseStamped()
+        self.avoid_pose = PoseStamped()
+        self.goal_pose = PoseStamped()
+        self.distance = Float32()
+        self.yaw = Float32()
+
+
+        #---------------Publishers---------------#
+        self.pose_control = rospy.Publisher('/position_control/set_position', PoseStamped, queue_size=10)
+        self.mode_control = rospy.Publisher('/position_control/set_mode', String, queue_size=10)
+        self.vel_control = rospy.Publisher('/position_control/set_velocity', PoseStamped, queue_size=10)
+        self.velpose_control = rospy.Publisher('/position_control/set_velocityPose',PoseStamped,queue_size=10)
+
+        # ---------------Subscribers---------------#
+
+        rospy.Subscriber('/position_control/distance', Bool, self.distance_reached_cb)
+        rospy.Subscriber('/position_control/Real_pose', PoseStamped, self._Real_pose_callback)
+        rospy.Subscriber('/position_control/set_mode', String, self.set_mode_callback)
+        rospy.Subscriber('/position_control/Yawangle', Float32, self.yaw_callback)
+
+        # ---------------Start---------------#
+        self.rate = rospy.Rate(20)
+        self.action_server = actionlib.SimpleActionServer('gotoposition_sensor', autonomous_offboard.msg.gotoposition_sensorAction,
+                                                          execute_cb=self.execute_cb, auto_start=False)
+        self.action_server.start()
+
+    def execute_cb(self, goal):
+
+        #Set the orientation before start in position mode.
+        self.mode_control.publish('velposctr')
+        Azimut = math.atan2(goal.destination.pose.position.y - self.Real_pose.pose.position.y,
+                             goal.destination.pose.position.x - self.Real_pose.pose.position.x)
+        quaternion = tf.transformations.quaternion_from_euler(0, 0, Azimut)
+        goal.destination.pose.orientation.x = quaternion[0]
+        goal.destination.pose.orientation.y = quaternion[1]
+        goal.destination.pose.orientation.z = quaternion[2]
+        goal.destination.pose.orientation.w = quaternion[3]
+        self.goal_pose = goal.destination
+        self.velpose_control.publish(goal.destination)
+
+
+        while not self.target_reached:
+            self.rate.sleep()
+
+        rospy.loginfo("Destination reached")
+        self.action_server.set_succeeded()
+
+
+
+    def distance_reached_cb(self, data):
+        self.target_reached = data.data
+
+    def _Real_pose_callback(self, data):
+        self.Real_pose = data
+
+
+    def set_mode_callback(self, data):
+        self.current_mode = data
+
+
+    def yaw_callback(self,data):
+        self.yaw = data
+
+
+
+
+if __name__ == '__main__':
+    try:
+
+        rospy.init_node('gotoposition_sensor_server')
+        gotoposition_sensor_server()
+    except rospy.ROSInterruptException:
+        pass
diff --git a/src/scripts/object-detection.pbtxt b/src/scripts/object-detection.pbtxt
new file mode 100755
index 0000000..e4b0964
--- /dev/null
+++ b/src/scripts/object-detection.pbtxt
@@ -0,0 +1,8 @@
+item{
+	id: 1
+	name: 'UAVFrame'
+}
+item{
+	id: 2
+	name: 'UAVCenter'
+}
diff --git a/src/scripts/object_detection/__init__.pyc b/src/scripts/object_detection/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..76f04a950a6cbb15173c178edca6d055ecf5e35f
GIT binary patch
literal 174
zcmZ9GF$w}f3`Iw@5W#zFWiBA%32ZD@Y{Kl!EJoeQvdJjk(_2`20kdLd;J**A_+<KC
zE?$S{F}UANthW}K8KQIhYBamb;Qk=BIXH2bAm1pGhv4->8Serz1n@;UbH_!H+qPjp
o#IKhyP_F{qoKsMYNv()8AW|kpT=fr~+xEKSSgvU^ejpb20X_9CAOHXW

literal 0
HcmV?d00001

diff --git a/src/scripts/object_detection/core/__init__.pyc b/src/scripts/object_detection/core/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3a5bc3829bba5d225f3e5eefd2fcd312b281e731
GIT binary patch
literal 179
zcmZ9GK?=e^3`IwDA%gel%3MIi6S#3xL<rNFDMsz2Oj5;rdJK17z*Jlr`0vBp{7m1=
z#jAcEg8SXXdTWuHAv(9OMzgC7?hkS_2Pf_l<Qqlu5WHR}<6S^X06!>a?syR7wr$v#
q`1KMB^(w&4IR(X-)QUJm;F185GAZJ!f9Tu>)*Z*;nl|GbVsRflU@rau

literal 0
HcmV?d00001

diff --git a/src/scripts/object_detection/core/standard_fields.pyc b/src/scripts/object_detection/core/standard_fields.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..9fa6d9409594225a394faa8026aa207d1e1513ee
GIT binary patch
literal 9726
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

literal 0
HcmV?d00001

diff --git a/src/scripts/object_detection/protos/__init__.pyc b/src/scripts/object_detection/protos/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..15d192b685b538b92fb313d2f714fc8f55b7f3cd
GIT binary patch
literal 181
zcmZ9GF$w}f3`Iw@5W#zFWiBA%32bZ@3&ZTpEJoeQGRZ35(^J@b0kdLd;J**A`I)|#
zi&y<T1oyj%_0}RYLv(Imjb>LF+#lp<4o=)9$Ty1QA$Yw|#=C%&0De%;-0>jDZQHOf
r@#`fN>Q#W7a|((vsTFaCzOb?YB4tv<RsYbrO{_bP!!>QjN5tYjtf?>j

literal 0
HcmV?d00001

diff --git a/src/scripts/object_detection/protos/string_int_label_map_pb2.pyc b/src/scripts/object_detection/protos/string_int_label_map_pb2.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b1ff27f89c3b50c877b8b6ab799f5a00c6996725
GIT binary patch
literal 3615
zcmc&$S#uLd5bl+HAX)OEU=UXTCnO>S37m_=AshzERkm@~en{zMYqT>GBUZaxJ0pTq
zc_Y6emFN7TJmgPMdCU(;x_cyB#)hDW6go!JJ$?7rv&#QnF8=kypUn^kudDcb7r*9@
zJb=WH2N6IMKml|;kU2Od^Y9EHtAU(=UjWiN$Vu8XbF450Q672|(3}L13`{dU1<h$k
zA7lC$Gz*R{FkOV^jH8Q8m!Me!Pt8EL3@_34ET~E7&Vif(Spr!GISX<Q6#ATpmmbRG
zoAaP%p}PQzIUXrgSYZJqZax5cobr*2Bq2}m{v_K)KH9|(id8|LqCDkkkY_-i1$hqS
zhrFI=&IM45ATP4-CGy=xQy<Yre#|y6@#^e<!or_22P;N_&QV~_<7M{v8GA%u=<y1B
z{G2@^=b%T5YFrmr*#-6plS1R@BLBZ6)j_ij=wQRI@p_$CPFXH<5x!u~m%M%j@@tUa
zfV@EkX}T`BX5Hj~Z~a%ZZnN0Rp=N!{rMttW!;pr}qQKs*bRF#DSc!bciQMHxs-Q5J
zDs-{hx8YQ9n(2AyVlNk91y2xqMBGH809`~E;&mFj=b-I@LYUnn4S65r12mX>nTO_i
zhBYQ~o-pPO)NUS9L*S08AwY2&Q0*eCA@sIut2o*EAAD_U+=0d!htR`i_<ewTGl9#`
zfa1j6tl<K@wM4&gG%-z#OXF$MQ;qn!mRdAIVV~(Z_|Y^>7B)oRCUMeB`X)%)?N%Z(
z$$S%LI<=;ew7M#^fm9ZMbP_kxEU^jd+DyltK*u(SL`y|MPozQGTCS(N_87WciA1j@
z#hpot0l)hx<dEPL%DBN4x_p6Q)wXMNv}vbsjfB<lb(ay*Dh?B=nD&u`_nM$jHQr0i
z1zALvRIX}C=6KV{>nUSI$3<>QC{yjomC^~#A<yjgT1ga0VMR-rf$;1Bi&R@nO^*ed
zT*l2fovCxzECrN`@EHbVP99;xi5W|sF)Gs{(myGQuFWgt6qm<$SvmQ-&cMgg<Kp5r
zV`we5>x7^Uk*-<QtCWfplw;Mq;MEG1Vlk&>HHZ7j%JE`JYLiA{H(-f8Ni2O|TsUN?
zvQnJTXbg?yYctFB`WvFCAJU`{>>_4+^hp6v+Wjcv01Q2d$FoeM(bkco__>`#Si(S<
z#8&8-hRW`yil?BhRV2-k-5!+j=mhF)o)D^Isa~+HxZi7GO9{H{n4D-zhsQNcQ|FeH
zc%bb9?w$&Rqu&<&$Og|v)K?6RgB%nCLu!57zIwx!a5n(Gvq(M^dUq5ZYZG8lDmHkZ
zaPE6lV8R4*C!8iJT{p(kouH+;My%KFqPN!oFFV$y&^W45?3i0)+Z$EqN#2Xvu=!XS
zi^D>7HST<vv>T{l)>5>v<@4x&&p?og7)O%(l*B4&8$KTyL1RT`^%F{k?uC&P6-)gq
z@u^>jKx-}|_nqs;z@WJ?^>Nhdq@rg~MbizZf1~9UE?kDyhuaVQwXK~eK9fPvOJqM%
zLGad|nm0UOYD;97o{47H)&0532uS!SYA1}Apv9o-BuOVy4kN98+o#LZQjmz~;XUm$
zIA|z?0cL%A+BmWOo7yKpa!Z2Ou4<oj8Lz8uOn6UHfoyTB9^rtm?mN6f@+WZdRYxOW
zvV-TYVteA;kWGXHXY`1!gMC|;f`23;<1P!S=n=`bgY6xEZS(Qk=Fa-P`w!PQ?rp8@
zJlwDqls|mLQM#KZXt|r!KTT26EjT*KW_WDR;>lwbt4tu`x9AT+m_!@yNw-6n7u9P(
za|%+2)~C_uJcg+cBz(f?{sWzN@9l4k1LqwAi}@Xwl6T3QAHMUY$$~e9@3~xgup??J
ySMVxc)jNZ0328@_4p8o_l$*+tJZtf9VZvD)wc|98kj>9~Wv`s8qK{I3`1>!U*@wyi

literal 0
HcmV?d00001

diff --git a/src/scripts/object_detection/utils/__init__.pyc b/src/scripts/object_detection/utils/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..ea778877dfd133ae4643d44f04215694f9331ebd
GIT binary patch
literal 180
zcmZ9GK?=e^3`IwDA%gel%3MIi6S#3Bf`sYJ6r=5=G#SNvdJC6cz*Jlr`0vBp{7m1=
z#q01q2KT#(_0}RYLv(Imjb>LF+#lp*4$j;q$Ty1QA$Yw~#=C$F0en%;+;I`)rm5Kv
r@#`fF)T;p3mlPCZQY+#NMX41)q)dvq>K{6{g>}cVv}rT`Ar|)mb)zqa

literal 0
HcmV?d00001

diff --git a/src/scripts/object_detection/utils/label_map_util.pyc b/src/scripts/object_detection/utils/label_map_util.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b4e34170840b7b2e077161fbf2f5432d16c5fd62
GIT binary patch
literal 6552
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

literal 0
HcmV?d00001

diff --git a/src/scripts/object_detection/utils/visualization_utils.pyc b/src/scripts/object_detection/utils/visualization_utils.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..1a8eae62fd32aab5839e9ba436f5a92366ecee2e
GIT binary patch
literal 24963
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

literal 0
HcmV?d00001

diff --git a/src/scripts/stuff/__init__.pyc b/src/scripts/stuff/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..8077279e27c97a52a8cd785706d20c6c127a1b19
GIT binary patch
literal 163
zcmZSn%**vQ;!0F90~9a<X$K%KW&si@3=F{<AQ3+eAi;n}6#D?h^fU5vQ}y%8GE*`W
z^^+4zvNQAI%Zv4ki<0#dOH1<e@^kY`i{tat(vtEMi&DVi#mPmP1tmZ=C8cR;`tk9Z
ed6^~g@p=W7B^*ElZF2KdN^?@}K-LxmF#`Z6)hMa}

literal 0
HcmV?d00001

diff --git a/src/scripts/stuff/helper.pyc b/src/scripts/stuff/helper.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..09ac878a88c4ea60668dba0d4b5aefc27d9a1154
GIT binary patch
literal 9279
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

literal 0
HcmV?d00001

-- 
GitLab