4 import roslib; roslib.load_manifest(
'control_turtlebot')
10 from geometry_msgs.msg
import Twist
11 from nav_msgs.msg
import Odometry
12 from control_turtlebot.srv
import GotoWaypoint, GotoWaypointResponse, FindPathToGoal, FindPathToGoalResponse, FindPathToGoalRequest
23 self.
serv_ = rospy.Service(
'/controller_turtlebot/goto',
34 rospy.wait_for_service(
'/controller_turtlebot/find_path_to_goal')
37 except rospy.ServiceException, e:
38 print "Service call failed: %s"%e
42 def calculateControlInput(self, req):
44 planner_request = FindPathToGoalRequest()
45 planner_request.new_goal =
True 46 planner_request.goal_state_x = req.goal_state_x
47 planner_request.goal_state_y = req.goal_state_y
48 planner_request.goal_state_z = req.goal_state_z
52 for pose
in planner_response.poses:
54 control_input = Twist()
59 loop_rate = rospy.Rate(100)
60 orientation_approach =
False 61 while not rospy.is_shutdown():
68 distance_to_goal = math.sqrt(math.pow(inc_x, 2.0) + math.pow(inc_y, 2.0))
70 if abs(yaw_error) > 0.04
and not orientation_approach:
71 control_input.angular.x = 0.0
72 control_input.angular.y = 0.0
73 control_input.angular.z = yaw_error * 1.0
75 control_input.linear.x = 0.0
76 control_input.linear.y = 0.0
77 control_input.linear.z = 0.0
79 control_input.angular.x = 0.0
80 control_input.angular.y = 0.0
81 control_input.angular.z = 0.0
83 orientation_approach =
True 84 liner_speed = abs(distance_to_goal) * 0.5
85 altitude_speed = inc_z * 0.5
88 control_input.linear.x = 0.1
89 elif liner_speed > 0.2:
90 control_input.linear.x = 0.2
92 control_input.linear.x = liner_speed
94 if abs(altitude_speed) < 0.1:
95 if altitude_speed ==0 :
96 control_input.linear.z = 0
97 elif altitude_speed > 0 :
98 control_input.linear.z = 0.1
100 control_input.linear.z = -0.1
102 elif abs(altitude_speed) > 0.2:
103 if altitude_speed > 0 :
104 control_input.linear.z = 0.2
106 control_input.linear.z = - 0.2
108 control_input.linear.z = altitude_speed
110 control_input.linear.y = 0.0
113 self.control_input_pub_.publish(control_input)
117 rospy.logdebug(
"%s: yaw_error: %f\n", rospy.get_name(), yaw_error)
120 rospy.logdebug(
"%s: distance_to_goal: %f\n", rospy.get_name(), distance_to_goal)
121 rospy.logdebug(
"%s: control_input.linear.x %f\n", rospy.get_name(), control_input.linear.x)
122 rospy.logdebug(
"%s: control_input.angular.z %f\n", rospy.get_name(), control_input.angular.z)
124 if distance_to_goal <= 0.2:
128 return GotoWaypointResponse()
130 def odomCallback(self, odometry_msg):
134 (r, p, y) = tf.transformations.euler_from_quaternion([odometry_msg.pose.pose.orientation.x, odometry_msg.pose.pose.orientation.y, odometry_msg.pose.pose.orientation.z, odometry_msg.pose.pose.orientation.w])
138 def wrapAngle(angle):
141 Calculates angles values between 0 and 2pi""" 142 return (angle + ( 2.0 * math.pi * math.floor( ( math.pi - angle ) / ( 2.0 * math.pi ) ) ) )
144 if __name__ ==
'__main__':
145 rospy.init_node(
'control_quadrotor', log_level=rospy.INFO)
146 rospy.loginfo(
"%s: starting quadrotor controller", rospy.get_name())
def calculateControlInput(self, req)
def odomCallback(self, odometry_msg)