diff --git a/src/launch/autonomous_offboard_coverage_descend.launch b/src/launch/autonomous_offboard_coverage_descend.launch index 8be0a7c5f655c7b51fdd6d401081aea14a1e3f6a..ddb1f146ddc2602b60fe380b637cdd8d0d6723d2 100644 --- a/src/launch/autonomous_offboard_coverage_descend.launch +++ b/src/launch/autonomous_offboard_coverage_descend.launch @@ -3,7 +3,7 @@ <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" /> + <node name="coverage_server" pkg="autonomous_offboard" type="coverage_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" /--> </launch> diff --git a/src/launch/autonomous_offboard_gotopos_sensor.launch b/src/launch/autonomous_offboard_gotopos_sensor.launch index 7a9b4f948b1c3a806d3986a499a750b3ddadb52b..67aedbb85fdd2efcdb1743c43ed27ac4b882f7a6 100644 --- a/src/launch/autonomous_offboard_gotopos_sensor.launch +++ b/src/launch/autonomous_offboard_gotopos_sensor.launch @@ -1,6 +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="goto_position_vel_server" pkg="autonomous_offboard" type="goto_position_vel_server.py" output="screen" /> <node name="gotoposition_sensor_server" pkg="autonomous_offboard" type="gotoposition_sensor_server.py" output="screen" /> </launch> diff --git a/src/scripts/action_controllerGotopos_sensor.py b/src/scripts/action_controllerGotopos_sensor.py index 5a7ee9638bf0b2deb5c3089596e91c41162e8890..272f88e989c96695a810e69e16b7f74b534828dd 100755 --- a/src/scripts/action_controllerGotopos_sensor.py +++ b/src/scripts/action_controllerGotopos_sensor.py @@ -6,17 +6,25 @@ import actionlib import mavros_state import time +import gripper_control + 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 std_msgs.msg import Float32, UInt16 from geometry_msgs.msg import PoseStamped if __name__ == '__main__': rospy.init_node('action_controllerGotopos_sensor') + gc = gripper_control.gripper_control() gotoposition_sensor_client = actionlib.SimpleActionClient('gotoposition_sensor', gotoposition_sensorAction) gotoposition_sensor_client.wait_for_server() gotoposition_sensor_goal = gotoposition_sensorGoal() + + 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() + msg = UInt16() print 'Setting offboard' mv_state.set_mode('OFFBOARD') print 'Arming vehicle' @@ -24,14 +32,70 @@ if __name__ == '__main__': rospy.loginfo("Taking off") time.sleep(10) - rospy.loginfo("First position") - gotoposition_sensor_goal.destination.pose.position.x = 2 + rospy.loginfo("Detect position") + gotoposition_sensor_goal.destination.pose.position.x = 20.5 + gotoposition_sensor_goal.destination.pose.position.y = 45 + gotoposition_sensor_goal.destination.pose.position.z = 5 + gotoposition_sensor_client.send_goal(gotoposition_sensor_goal) + gotoposition_sensor_client.wait_for_result() + #DESCENDING + rospy.loginfo("closing grippers") + msg.data = 180 + gc.close_short_gripper(msg) + + + time.sleep(3) + + rospy.loginfo("Drop off position") + gotoposition_sensor_goal.destination.pose.position.x = 100 + gotoposition_sensor_goal.destination.pose.position.y = -27 + gotoposition_sensor_goal.destination.pose.position.z = 5 + gotoposition_sensor_client.send_goal(gotoposition_sensor_goal) + gotoposition_sensor_client.wait_for_result() + + time.sleep(3) + + rospy.loginfo("going down to drop off position") + gotoposition_sensor_goal.destination.pose.position.x = 100 + gotoposition_sensor_goal.destination.pose.position.y = -27 + gotoposition_sensor_goal.destination.pose.position.z = 0.25 + gotoposition_sensor_client.send_goal(gotoposition_sensor_goal) + gotoposition_sensor_client.wait_for_result() + + rospy.loginfo("opening grippers") + gc.open_short_gripper(msg) + time.sleep(2) + gc.Goff_gripper(msg) + time.sleep(3) + + rospy.loginfo("Going to up before returning home") + gotoposition_sensor_goal.destination.pose.position.x = 100 + gotoposition_sensor_goal.destination.pose.position.y = -27 + gotoposition_sensor_goal.destination.pose.position.z = 5 + gotoposition_sensor_client.send_goal(gotoposition_sensor_goal) + gotoposition_sensor_client.wait_for_result() + + time.sleep(3) + + rospy.loginfo("returning home") + gotoposition_sensor_goal.destination.pose.position.x = 0 gotoposition_sensor_goal.destination.pose.position.y = 0 - gotoposition_sensor_goal.destination.pose.position.z = 3 + gotoposition_sensor_goal.destination.pose.position.z = 5 gotoposition_sensor_client.send_goal(gotoposition_sensor_goal) gotoposition_sensor_client.wait_for_result() + time.sleep(3) + + 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.15 + goto_position_vel_client.send_goal(goto_position_vel_goal) + goto_position_vel_client.wait_for_result() + rospy.loginfo("Trying to land, 2 second sleep") + time.sleep(2) + + mv_state.arm(False) + - 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 index 2709bb59d07ea92927bc2f9d4f65addc6ea4ea8e..4558fd851b9764edac1f7bd80ea32edb79bed342 100755 --- a/src/scripts/action_controller_coverage_descend.py +++ b/src/scripts/action_controller_coverage_descend.py @@ -24,12 +24,12 @@ if __name__ == '__main__': mv_state.arm(True) rospy.loginfo("Taking off") time.sleep(10) - + rospy.loginfo("going to coverage") 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.x = -10 + coverage_goal.destination.pose.position.y = 20 coverage_goal.destination.pose.position.z = 5 coverage_client.send_goal(coverage_goal) coverage_client.wait_for_result() @@ -39,69 +39,14 @@ if __name__ == '__main__': 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) + rospy.loginfo("ABORT no object detected. going home") + 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, 2 second sleep") + time.sleep(2) + + mv_state.arm(False) diff --git a/src/scripts/action_controller_descend.py b/src/scripts/action_controller_descend.py index 64d53dadc394f7190e0394c5bc9673e6c72f8d45..5fac8ab740fc439214c510f010655b294fb71124 100755 --- a/src/scripts/action_controller_descend.py +++ b/src/scripts/action_controller_descend.py @@ -13,33 +13,33 @@ from std_msgs.msg import Float32 from geometry_msgs.msg import PoseStamped if __name__ == '__main__': - rospy.init_node('action_controller_descend') + rospy.init_node('action_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() + gotoposition_sensor_client = actionlib.SimpleActionClient('gotoposition_sensor', gotoposition_sensorAction) + gotoposition_sensor_client.wait_for_server() + gotoposition_sensor_goal = gotoposition_sensorGoal() + descend_on_object_client = actionlib.SimpleActionClient('descend_on_object', descend_on_objectAction) + descend_on_object_client.wait_for_server() + descend_on_object_goal = descend_on_objectGoal() mv_state = mavros_state.mavros_state() print 'Setting offboard' mv_state.set_mode('OFFBOARD') print 'Arming vehicle' - print 'Takeoff' mv_state.arm(True) - print 'Sleeping 20 sec' - time.sleep(20) + rospy.loginfo("Taking off") + time.sleep(10) rospy.loginfo("Detect position") - goto_position_vel_goal.destination.pose.position.x = 4 - 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() + gotoposition_sensor_goal.destination.pose.position.x = 20.5 + gotoposition_sensor_goal.destination.pose.position.y = 45 + gotoposition_sensor_goal.destination.pose.position.z = 5 + gotoposition_sensor_client.send_goal(gotoposition_sensor_goal) + gotoposition_sensor_client.wait_for_result() - time.sleep(2) - 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() @@ -49,40 +49,37 @@ if __name__ == '__main__': 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) + time.sleep(3) + + print 'Setting offboard' + mv_state.set_mode('OFFBOARD') + print 'Arming vehicle' + mv_state.arm(True) + + time.sleep(3) + + rospy.loginfo("Get some height") + 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 = 5 + goto_position_vel_client.send_goal(goto_position_vel_goal) + goto_position_client.wait_for_result() + + time.sleep(3) + rospy.loginfo("Going home") + gotoposition_sensor_goal.destination.pose.position.x = 0 + gotoposition_sensor_goal.destination.pose.position.y = 0 + gotoposition_sensor_goal.destination.pose.position.z = 5 + gotoposition_sensor_client.send_goal(gotoposition_sensor_goal) + gotoposition_sensor_client.wait_for_result() + + time.sleep(3) + + rospy.loginfo("Get some height") + 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.25 + goto_position_vel_client.send_goal(goto_position_vel_goal) + goto_position_client.wait_for_result() + + diff --git a/src/scripts/action_controller_pid_square.py b/src/scripts/action_controller_pid_square.py index c66f2c606440df9dbacf3cb71f91e7d93135d245..c7a147e2756ecf4996cb803d3cf3b558c26f8cb3 100755 --- a/src/scripts/action_controller_pid_square.py +++ b/src/scripts/action_controller_pid_square.py @@ -25,7 +25,7 @@ if __name__ == '__main__': time.sleep(10) rospy.loginfo("First position") - goto_position_vel_goal.destination.pose.position.x = 5 + 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 = 3 goto_position_vel_client.send_goal(goto_position_vel_goal) @@ -33,17 +33,17 @@ if __name__ == '__main__': 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 + rospy.loginfo("First position") + goto_position_vel_goal.destination.pose.position.x = 10 + 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("Third position") - goto_position_vel_goal.destination.pose.position.x = -5 + rospy.loginfo("Second position") + 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 = 3 goto_position_vel_client.send_goal(goto_position_vel_goal) @@ -51,13 +51,13 @@ if __name__ == '__main__': time.sleep(10) - rospy.loginfo("Fourth position") + rospy.loginfo("Landing") 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_goal.destination.pose.position.y = 0 + goto_position_vel_goal.destination.pose.position.z = -0.15 goto_position_vel_client.send_goal(goto_position_vel_goal) goto_position_vel_client.wait_for_result() + rospy.loginfo("Trying to land, 2 second sleep") + time.sleep(2) - time.sleep(10) - - mv_state.land(0.0) + mv_state.arm(False) diff --git a/src/scripts/action_controller_takeoff_test.py b/src/scripts/action_controller_takeoff_test.py index 69c8c0aaabba1dfb5656324bc1f251eb4140d1ef..9f6c86e3c802a527eb94428bb3a8949ea8d4fb9b 100755 --- a/src/scripts/action_controller_takeoff_test.py +++ b/src/scripts/action_controller_takeoff_test.py @@ -28,20 +28,20 @@ if __name__ == '__main__': rospy.loginfo("change true height position") 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 = 7 + goto_position_vel_goal.destination.pose.position.y = 5 + goto_position_vel_goal.destination.pose.position.z = 5 goto_position_vel_client.send_goal(goto_position_vel_goal) goto_position_vel_client.wait_for_result() rospy.loginfo("10 second sleep before landing") time.sleep(10) - 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, 5 second sleep") - time.sleep(2) + #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, 2 second sleep") + #time.sleep(2) - mv_state.arm(False) + #mv_state.arm(False) diff --git a/src/scripts/coverage_server.py b/src/scripts/coverage_server.py index 642bd15903077120938af697a1557cc6bd29a2b1..a481137cb4b24f39929c36d056b583a028ee298d 100755 --- a/src/scripts/coverage_server.py +++ b/src/scripts/coverage_server.py @@ -17,11 +17,11 @@ class coverage_server(): self.cur_pose = PoseStamped() self.waypoints = np.empty((0,3)) self.destination = PoseStamped() - self.angleOfViewWidth = 37 - self.angleOfViewHeight = 47 - self.areaWidth = 20 - self.areaHeight = 20 - self.searchHeight = 10 + self.angleOfViewWidth = 37.0 + self.angleOfViewHeight = 47.0 + self.areaWidth = 20.0 + self.areaHeight = 20.0 + self.searchHeight = 10.0 self.detectedPos = PoseStamped() self.detectedPos.pose.position.x = float("inf") self.result = autonomous_offboard.msg.coverageResult() @@ -29,8 +29,9 @@ class coverage_server(): rospy.Subscriber('/mavros/local_position/pose', PoseStamped, self.cur_pose_cb) self.set_xy_vel = rospy.Publisher('/position_control/set_xy_vel', Float32, queue_size=10) + self.position_publisher = rospy.Publisher('/coverage_server/position', PoseStamped, queue_size=10) - self.goto_position_client = actionlib.SimpleActionClient('goto_position', goto_position_velAction) + self.goto_position_client = actionlib.SimpleActionClient('goto_position_vel', goto_position_velAction) #self.detect_object_client = actionlib.SimpleActionClient('detect_object', detect_objectAction) self.rate = rospy.Rate(20) self.action_server = actionlib.SimpleActionServer('coverage', @@ -43,6 +44,8 @@ class coverage_server(): xyVel.data = 1 self.set_xy_vel.publish(xyVel) goto_position_goal = goto_position_velGoal() + goto_position_goal.destination.pose.orientation.w = 0.707 + goto_position_goal.destination.pose.orientation.z = 0.707 self.goto_position_client.wait_for_server() #self.detect_object_client.wait_for_server() self.destination = goal.destination @@ -52,6 +55,7 @@ class coverage_server(): goto_position_goal.destination.pose.position.x = self.waypoints.item((idx, 0)) goto_position_goal.destination.pose.position.y = self.waypoints.item((idx, 1)) goto_position_goal.destination.pose.position.z = self.waypoints.item((idx, 2)) + self.position_publisher.publish(self.cur_pose) self.goto_position_client.send_goal(goto_position_goal) self.goto_position_client.wait_for_result() idx = idx + 1 @@ -73,22 +77,22 @@ class coverage_server(): #calculate waypoints def calculate_waypoints(self): - cameraWidth = 2 * self.searchHeight * math.tan(math.radians(self.angleOfViewWidth/2)) - cameraHeight = 2 * self.searchHeight * math.tan(math.radians(self.angleOfViewHeight/2)) + cameraWidth = 2 * self.searchHeight * math.tan(math.radians(self.angleOfViewWidth/2.0)) + cameraHeight = 2 * self.searchHeight * math.tan(math.radians(self.angleOfViewHeight/2.0)) lastWaypoint = PoseStamped() - lastWaypoint.pose.position.x = self.destination.pose.position.x - self.areaWidth/2 - lastWaypoint.pose.position.y = self.destination.pose.position.y - self.areaHeight / 2 + lastWaypoint.pose.position.x = self.destination.pose.position.x - self.areaWidth/2.0 + lastWaypoint.pose.position.y = self.destination.pose.position.y - self.areaHeight / 2.0 lastWaypoint.pose.position.z = self.searchHeight tempArr = [] tempArr.append([lastWaypoint.pose.position.x, lastWaypoint.pose.position.y, lastWaypoint.pose.position.z]) - while(lastWaypoint.pose.position.x + cameraWidth/2 < self.destination.pose.position.x + self.areaWidth/2): + while(lastWaypoint.pose.position.x + cameraWidth/2.0 < self.destination.pose.position.x + self.areaWidth/2.0): #check if going upwards or downwards if(cameraHeight > 0): - while(lastWaypoint.pose.position.y + cameraHeight/2 < self.destination.pose.position.y + self.areaHeight/2): + while(lastWaypoint.pose.position.y + cameraHeight/2.0 < self.destination.pose.position.y + self.areaHeight/2.0): lastWaypoint.pose.position.y = lastWaypoint.pose.position.y + cameraHeight tempArr.append([lastWaypoint.pose.position.x, lastWaypoint.pose.position.y, lastWaypoint.pose.position.z]) elif(cameraHeight < 0): - while (lastWaypoint.pose.position.y + cameraHeight / 2 > self.destination.pose.position.y - self.areaHeight / 2): + while (lastWaypoint.pose.position.y + cameraHeight / 2.0 > self.destination.pose.position.y - self.areaHeight / 2.0): lastWaypoint.pose.position.y = lastWaypoint.pose.position.y + cameraHeight tempArr.append([lastWaypoint.pose.position.x, lastWaypoint.pose.position.y, lastWaypoint.pose.position.z]) @@ -101,10 +105,10 @@ class coverage_server(): def calculate_waypoints2(self): tempArr = [] - self.cameraWidth = 2 * self.searchHeight * math.tan(math.radians(self.angleOfViewWidth / 2)) - self.cameraHeight = 2 * self.searchHeight * math.tan(math.radians(self.angleOfViewHeight / 2)) - startPointX = self.destination.pose.position.x - self.areaWidth / 2 + self.cameraWidth / 2 - startPointY = self.destination.pose.position.y - self.areaHeight / 2 + self.cameraHeight / 2 + self.cameraWidth = 2.0 * self.searchHeight * math.tan(math.radians(self.angleOfViewWidth / 2.0)) + self.cameraHeight = 2.0 * self.searchHeight * math.tan(math.radians(self.angleOfViewHeight / 2.0)) + startPointX = self.destination.pose.position.x - self.areaWidth / 2.0 + self.cameraWidth / 2.0 + startPointY = self.destination.pose.position.y - self.areaHeight / 2.0 + self.cameraHeight / 2.0 self.nrOfStepsHeight = int(math.floor(self.areaHeight / self.cameraHeight)) self.nrOfStepsWidth = int(math.floor(self.areaWidth / self.cameraWidth)) diff --git a/src/scripts/descend_on_object_server.py b/src/scripts/descend_on_object_server.py index dfdff49034672000f6b3ff0a4e83727ade5fca79..9ee711a7d7a67690400d6bed16236a5c3caea5b4 100755 --- a/src/scripts/descend_on_object_server.py +++ b/src/scripts/descend_on_object_server.py @@ -2,6 +2,8 @@ import rospy import actionlib import autonomous_offboard.msg +import tf +import math from geometry_msgs.msg import PoseStamped, Point from std_msgs.msg import Bool, String, Float32 import time @@ -13,6 +15,11 @@ class descend_on_object_server(): # variables self.local_pose = PoseStamped() self.des_pose = PoseStamped() + quaternion = tf.transformations.quaternion_from_euler(0, 0, math.radians(90)) + des_pose.pose.orientation.x = quaternion[0] + des_pose.pose.orientation.y = quaternion[1] + des_pose.pose.orientation.z = quaternion[2] + des_pose.pose.orientation.w = quaternion[3] self.object_pose = Point() self.object_pose_center = Point() @@ -102,7 +109,7 @@ class descend_on_object_server(): print("Landing") self.des_pose.pose.position.x = 0 self.des_pose.pose.position.y = 0 - self.des_pose.pose.position.z = -0.1 + self.des_pose.pose.position.z = -0.15 self.vel_control.publish(self.des_pose) time.sleep(0.1) while not self.target_reached: diff --git a/src/scripts/goto_position_vel_server.py b/src/scripts/goto_position_vel_server.py index 02b51f5290ac538f4540944346e94850e8be4b35..471801ebd834f815207c354bfe48d78fec17e3ad 100755 --- a/src/scripts/goto_position_vel_server.py +++ b/src/scripts/goto_position_vel_server.py @@ -2,7 +2,7 @@ import rospy import actionlib import autonomous_offboard.msg -from std_msgs.msg import Bool, String +from std_msgs.msg import Bool, String, Float32 from geometry_msgs.msg import PoseStamped class goto_position_vel_server(): @@ -13,7 +13,6 @@ class goto_position_vel_server(): #publishers self.pose_control = rospy.Publisher('/position_control/set_velocity', PoseStamped, queue_size=10) self.mode_control = rospy.Publisher('/position_control/set_mode', String, queue_size=10) - #subscribers rospy.Subscriber('/position_control/distance', Bool, self.distance_reached_cb) diff --git a/src/scripts/gotoposition_sensor_server.py b/src/scripts/gotoposition_sensor_server.py index 213939b31f8be43e17389a6bd47c18d97ca59ea1..8d333c3f8c0b892d06f0a88a118425a4d10dcc2d 100755 --- a/src/scripts/gotoposition_sensor_server.py +++ b/src/scripts/gotoposition_sensor_server.py @@ -23,6 +23,7 @@ class gotoposition_sensor_server(): self.avoid_pose = PoseStamped() self.goal_pose = PoseStamped() self.distance = Float32() + self.target_reached = False self.yaw = Float32() @@ -32,12 +33,12 @@ class gotoposition_sensor_server(): 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) @@ -46,19 +47,16 @@ class gotoposition_sensor_server(): 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) + quaternion = tf.transformations.quaternion_from_euler(0, 0, math.radians(90)) 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) - + rospy.sleep(0.1) while not self.target_reached: self.rate.sleep() @@ -79,8 +77,7 @@ class gotoposition_sensor_server(): self.current_mode = data - def yaw_callback(self,data): - self.yaw = data + diff --git a/src/scripts/models/ssd_mobilenet_v11_coco/frozen_inference_graph.pb b/src/scripts/models/ssd_mobilenet_v11_coco/frozen_inference_graph.pb index 9077a968d1d9f2691d5b4023c29b100619ec08c8..c1f3353866dd7115eb95618502011526e62a020a 100644 Binary files a/src/scripts/models/ssd_mobilenet_v11_coco/frozen_inference_graph.pb and b/src/scripts/models/ssd_mobilenet_v11_coco/frozen_inference_graph.pb differ diff --git a/src/scripts/position_control.py b/src/scripts/position_control.py index 32eb4cced771161d71020187613a112f0c141aef..e5df4e7b814fc0e6848f5756377893de99f93eb0 100755 --- a/src/scripts/position_control.py +++ b/src/scripts/position_control.py @@ -223,11 +223,16 @@ class position_control(): booldist = self.is_at_position(self.local_pose.pose.position, self._pose_msg.pose.position, 0.5) boolvel = self.hover_velocity() self.dist.publish(booldist and boolvel) - elif self.current_mode.data == 'velctr' or self.current_mode.data == 'velposctr': + elif self.current_mode.data == 'velctr': # print("target vel_pos: {}".format(vel_pose_tot)) booldist = self.is_at_position(self.real_pose.pose.position, self._vel_pose_msg.pose.position, 0.2) boolvel = self.hover_velocity() self.dist.publish(booldist and boolvel) + elif self.current_mode.data == 'velposctr': + # print("target vel_pos: {}".format(vel_pose_tot)) + booldist = self.is_at_position(self.real_pose.pose.position, self._velpose_msg.pose.position, 0.3) + boolvel = self.hover_velocity() + self.dist.publish(booldist and boolvel) def is_at_position(self, p_current, p_desired, offset): des_pos = np.array((p_desired.x, diff --git a/src/scripts/tensorflow_hw_mvBlueFox_detection.py b/src/scripts/tensorflow_hw_mvBlueFox_detection.py index 6b64c32833302488bc7364f3935be6429bd641cd..5cac0d2c5b13d40bb7e0fd00f05705fb2d0d76e6 100755 --- a/src/scripts/tensorflow_hw_mvBlueFox_detection.py +++ b/src/scripts/tensorflow_hw_mvBlueFox_detection.py @@ -6,8 +6,8 @@ import rospy # Ros Messages from sensor_msgs.msg import CompressedImage, Image from cv_bridge import CvBridge, CvBridgeError -from geometry_msgs.msg import Point - +from geometry_msgs.msg import Point, PoseStamped +from std_msgs.msg import Bool #Tensorflow imports import numpy as np import os @@ -29,7 +29,7 @@ from stuff.helper import FPS2, WebcamVideoStream, SessionWorker import time import sys -sys.path.insert(0, '/home/nvidia/catkin_ws/src/autonomous_offboard/src/scripts/') +sys.path.insert(0, '/home/pateman/catkin_ws/src/autonomous_offboard/src/scripts') ## LOAD CONFIG PARAMS ## if (os.path.isfile('/home/nvidia/catkin_ws/src/autonomous_offboard/src/scripts/config.yml')): @@ -58,16 +58,33 @@ ssd_shape = cfg['ssd_shape'] class tensorflow_detection: def __init__(self): + self.quad_3d_frame = np.float32([[-0.345, -0.345, 0], [0.345, -0.345, 0], [0.345, 0.345, 0], [-0.345, 0.345, 0]]) + self.quad_3d_center = np.float32([[-0.11075, -0.11075, 0], [0.11075, -0.11075, 0], [0.11075, 0.11075, 0], [-0.11075, 0.11075, 0]]) + #----REAL--- + self.K = np.float64([[1168.084098028661, 0, 545.2679414486556], + [0, 1164.433590234314, 526.4386170901346], + [0.0, 0.0, 1.0]]) + # ----GAZEBO--- + #self.K = np.float64([[1472.512772, 0, 640.5], + # [0, 1472.512772, 480.5], + # [0.0, 0.0, 1.0]]) + self.dist_coef = np.float64([-0.06624560142145453, 0.05966170895627322, 0.002933236970742761, -0.01336570576300551, 0]) self.detection_graph, score, expand = self.load_frozenmodel() self.category_index = self.load_labelmap() config = tf.ConfigProto(allow_soft_placement=True, log_device_placement=log_device) config.gpu_options.allow_growth = allow_memory_growth + self.target_reached = False + self.local_pose = PoseStamped() cur_frames = 0 + self.write_flag = False + self.write_flag_center = False + self.countDet = 0 + self.countDet_center = 0 with self.detection_graph.as_default(): with tf.Session(graph=self.detection_graph, config=config) as self.sess: self.cam_read = Image() # topic where we publish - #self.image_pub = rospy.Publisher("/tensorflow_detection/image", Image, queue_size=10) + self.image_pub = rospy.Publisher("/tensorflow_detection/image", Image, queue_size=10) self.bridge = CvBridge() # topic where the coordinates go self.cam_pose_pub = rospy.Publisher("/tensorflow_detection/cam_point", Point, queue_size=1) @@ -76,14 +93,21 @@ class tensorflow_detection: self.cam_pose_center = Point() # subscribed Topic self.subscriber = rospy.Subscriber("/mv_29901972/image_raw", Image, self.callback, queue_size=1) - - #self.detection(graph, category, score, expand) + #self.subscriber = rospy.Subscriber("/uav_camera/image_raw_down", Image, self.callback, queue_size=1) + #rospy.Subscriber('/position_control/distance', Bool, self.distance_reached_cb) + #rospy.Subscriber('/mavros/local_position/pose', PoseStamped, self._local_pose_callback) + #self.positioning_file = open("/home/pateman/catkin_ws/src/autonomous_offboard/src/positioning_data.txt", + # "w") self.threshold = 0.6 - + def distance_reached_cb(self, data): + self.target_reached = data.data + def _local_pose_callback(self, data): + self.local_pose = data def callback(self, ros_data): + try: cv_image = self.bridge.imgmsg_to_cv2(ros_data, "bgr8") except CvBridgeError as e: @@ -114,7 +138,10 @@ class tensorflow_detection: for i in range(0, num): score = scores[0][i] if score >= self.threshold: - print(int(classes[0][i])) + #if (self.target_reached == False): + # self.write_flag = False + # self.write_flag_center = False + #print(int(classes[0][i])) #if the whole frame is detected if int(classes[0][i]) == 1: frame_flag_detected = True @@ -153,22 +180,18 @@ class tensorflow_detection: self.cam_pose_center.y = float("inf") self.cam_pose_center.z = float("inf") self.cam_pose_center_pub.publish(self.cam_pose_center) - #try: - # self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image, "bgr8")) - #except CvBridgeError as e: - # print(e) + try: + self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image, "bgr8")) + except CvBridgeError as e: + print(e) def find_relative_pose(self, x, y, w, h): - quad_3d = np.float32([[-0.345, -0.345, 0], [0.345, -0.345, 0], [0.345, 0.345, 0], [-0.345, 0.345, 0]]) - quad = np.float32( - [[x - w / 2, y - h / 2], [x - w / 2, y + h / 2], [x + w / 2, y + h / 2], [x + w / 2, y - h / 2]]) - - K = np.float64([[1472.512772, 0, 640.5], - [0, 1472.512772, 480.5], - [0.0, 0.0, 1.0]]) - - - dist_coef = np.zeros(4) - _ret, rvec, tvec = cv2.solvePnP(quad_3d, quad, K, dist_coef) + #-----GAZEBO-----# + #quad = np.float32( + # [[x - w / 2, y - h / 2], [x - w / 2, y + h / 2], [x + w / 2, y + h / 2], [x + w / 2, y - h / 2]]) + #-------REAL--------# + quad = np.float32([[x - w / 2, y - h / 2], [x + w / 2, y - h / 2], [x + w / 2, y + h / 2], [x - w / 2, y + h / 2]]) + #dist_coef_zero = np.zeros(4) + _ret, rvec, tvec = cv2.solvePnP(self.quad_3d_frame, quad, self.K, self.dist_coef) rmat = cv2.Rodrigues(rvec)[0] #self.rotationMatrixToEulerAngles(rmat) cameraTranslatevector = -np.matrix(rmat).T * np.matrix(tvec) @@ -177,26 +200,32 @@ class tensorflow_detection: T0[:3, :3] = rmat T0[:4, 3] = [0, 0, 0, 1] T0[:3, 3] = np.transpose(cameraTranslatevector) - - p0 = np.array([-0.345 / 2, -0.3011 / 2, 0, 1]) + ####----REAL----#### + p0 = np.array([0.300 / 2, -0.345 / 2, 0, 1]) + ###-----GAZEBO----# + #p0 = np.array([-0.345 / 2, -0.345 / 2, 0, 1]) z0 = np.dot(T0, p0) - self.cam_pose.x = z0.item(0) + self.cam_pose.x = -z0.item(0) self.cam_pose.y = z0.item(1) self.cam_pose.z = z0.item(2) + #if (self.target_reached and self.write_flag == False): + # self.positioning_file.write( + # "Frame: Local position: [{}, {}, {}], Object position: [5, 5, 0], positioning: [{}, {}, {}], count: {}\n".format( + # self.local_pose.pose.position.x, self.local_pose.pose.position.y, self.local_pose.pose.position.z, + # self.cam_pose.x, self.cam_pose.y, self.cam_pose.z, self.countDet)) + # self.write_flag = True + # self.countDet += 1 self.cam_pose_pub.publish(self.cam_pose) def find_relative_pose_center(self, x, y, w, h): - quad_3d = np.float32([[-0.11075, -0.11075, 0], [0.11075, -0.11075, 0], [0.11075, 0.11075, 0], [-0.11075, 0.11075, 0]]) + # -------GAZEBO--------# + #quad = np.float32( + # [[x - w / 2, y - h / 2], [x - w / 2, y + h / 2], [x + w / 2, y + h / 2], [x + w / 2, y - h / 2]]) + # -------REAL--------# quad = np.float32( - [[x - w / 2, y - h / 2], [x - w / 2, y + h / 2], [x + w / 2, y + h / 2], [x + w / 2, y - h / 2]]) - - K = np.float64([[1472.512772, 0, 640.5], - [0, 1472.512772, 480.5], - [0.0, 0.0, 1.0]]) - - - dist_coef = np.zeros(4) - _ret, rvec, tvec = cv2.solvePnP(quad_3d, quad, K, dist_coef) + [[x - w / 2, y - h / 2], [x + w / 2, y - h / 2], [x + w / 2, y + h / 2], [x - w / 2, y + h / 2]]) + #dist_coef_zero = np.zeros(4) + _ret, rvec, tvec = cv2.solvePnP(self.quad_3d_center, quad, self.K, self.dist_coef) rmat = cv2.Rodrigues(rvec)[0] #self.rotationMatrixToEulerAngles(rmat) cameraTranslatevector = -np.matrix(rmat).T * np.matrix(tvec) @@ -205,13 +234,22 @@ class tensorflow_detection: T0[:3, :3] = rmat T0[:4, 3] = [0, 0, 0, 1] T0[:3, 3] = np.transpose(cameraTranslatevector) - - p0 = np.array([-0.2215 / 2, -0.2061 / 2, 0, 1]) + ####----REAL----#### + p0 = np.array([0.200 / 2, -0.100 / 2, 0, 1]) + ####----GAZEBO----#### + #p0 = np.array([-0.11075 / 2, -0.11075 / 2, 0, 1]) z0 = np.dot(T0, p0) - self.cam_pose_center.x = z0.item(0) + self.cam_pose_center.x = -z0.item(0) self.cam_pose_center.y = z0.item(1) self.cam_pose_center.z = z0.item(2) + #if (self.target_reached and self.write_flag_center == False): + # self.positioning_file.write( + # "Center: Local position: [{}, {}, {}], Object position: [5, 5, 0], positioning: [{}, {}, {}], count: {}\n".format( + # self.local_pose.pose.position.x, self.local_pose.pose.position.y, self.local_pose.pose.position.z, + # self.cam_pose.x, self.cam_pose.y, self.cam_pose.z, self.countDet_center)) + # self.write_flag_center = True + # self.countDet_center += 1 self.cam_pose_center_pub.publish(self.cam_pose_center) def isRotationMatrix(self,R): @@ -360,3 +398,4 @@ if __name__ == '__main__': +