fly_back_and_forth.cpp
Go to the documentation of this file.
00001 /*
00002 Parker Conroy
00003 Algorithmic Robotics Lab @ University of Utah
00004 
00005 
00006 This code actuates the AR Drone back and forth.
00007 It is intended as a simple example for those starting with the AR Drone platform.
00008 */
00009 #include <ros/ros.h>
00010 #include <std_msgs/Empty.h>
00011 #include <geometry_msgs/Twist.h>
00012 
00013         geometry_msgs::Twist twist_msg;
00014         geometry_msgs::Twist twist_msg_neg;
00015         geometry_msgs::Twist twist_msg_hover;
00016         geometry_msgs::Twist twist_msg_up;
00017         std_msgs::Empty emp_msg;
00018         
00019 
00020 int main(int argc, char** argv)
00021 {
00022 
00023         ROS_INFO("ARdrone Test Back and Forth Starting");
00024         ros::init(argc, argv,"ARDrone_test");
00025     ros::NodeHandle node;
00026     ros::Rate loop_rate(50);
00027 
00028         ros::Publisher pub_empty_land;
00029         ros::Publisher pub_twist;
00030         ros::Publisher pub_empty_takeoff;
00031         ros::Publisher pub_empty_reset;
00032         double start_time;
00033 
00034 //hover message
00035                         twist_msg_hover.linear.x=0.0; 
00036                         twist_msg_hover.linear.y=0.0;
00037                         twist_msg_hover.linear.z=0.0;
00038                         twist_msg_hover.angular.x=0.0; 
00039                         twist_msg_hover.angular.y=0.0;
00040                         twist_msg_hover.angular.z=0.0;  
00041 //up message
00042                         twist_msg_up.linear.x=0.0; 
00043                         twist_msg_up.linear.y=0.0;
00044                         twist_msg_up.linear.z=0.5;
00045                         twist_msg_up.angular.x=0.0; 
00046                         twist_msg_up.angular.y=0.0;
00047                         twist_msg_up.angular.z=0.0;
00048 //command message
00049                         float takeoff_time=5.0;
00050                         float fly_time=7.0;
00051                         float land_time=3.0;
00052                         float kill_time =2.0;   
00053                         
00054                         
00055                         twist_msg.linear.x=0.0; 
00056                         twist_msg.linear.y=0.25;
00057                         twist_msg.linear.z=0.0;
00058                         twist_msg.angular.x=0.0; 
00059                         twist_msg.angular.y=0.0;
00060                         twist_msg.angular.z=0.0;
00061 
00062                         twist_msg_neg.linear.x=-twist_msg.linear.x; 
00063                         twist_msg_neg.linear.y=-twist_msg.linear.y;
00064                         twist_msg_neg.linear.z=-twist_msg.linear.z;
00065                         twist_msg_neg.angular.x=-twist_msg.angular.x; 
00066                         twist_msg_neg.angular.y=-twist_msg.angular.y;
00067                         twist_msg_neg.angular.z=-twist_msg.angular.z;
00068 
00069 
00070         
00071     pub_twist = node.advertise<geometry_msgs::Twist>("/cmd_vel", 1); /* Message queue length is just 1 */
00072         pub_empty_takeoff = node.advertise<std_msgs::Empty>("/ardrone/takeoff", 1); /* Message queue length is just 1 */
00073         pub_empty_land = node.advertise<std_msgs::Empty>("/ardrone/land", 1); /* Message queue length is just 1 */
00074 pub_empty_reset = node.advertise<std_msgs::Empty>("/ardrone/reset", 1); /* Message queue length is just 1 */
00075 
00076         
00077         start_time =(double)ros::Time::now().toSec();   
00078         ROS_INFO("Starting ARdrone_test loop");
00079 
00080 
00081 while (ros::ok()) {
00082                 while ((double)ros::Time::now().toSec()< start_time+takeoff_time){ //takeoff
00083                 
00084                         pub_empty_takeoff.publish(emp_msg); //launches the drone
00085                                 pub_twist.publish(twist_msg_hover); //drone is flat
00086                         ROS_INFO("Taking off");
00087                         ros::spinOnce();
00088                         loop_rate.sleep();
00089                         }//while takeoff
00090 
00091                 while  ((double)ros::Time::now().toSec()> start_time+takeoff_time+fly_time){
00092                 
00093                         pub_twist.publish(twist_msg_hover); //drone is flat
00094                         pub_empty_land.publish(emp_msg); //lands the drone
00095                         ROS_INFO("Landing");
00096                         
00097                                         
00098                         if ((double)ros::Time::now().toSec()> takeoff_time+start_time+fly_time+land_time+kill_time){
00099                 
00100                                 ROS_INFO("Closing Node");
00101                                 //pub_empty_reset.publish(emp_msg); //kills the drone           
00102                                 exit(0);        }//kill node
00103                         ros::spinOnce();
00104                         loop_rate.sleep();                      
00105 }//while land
00106 
00107                 while ( (double)ros::Time::now().toSec()> start_time+takeoff_time &&                                            (double)ros::Time::now().toSec()< start_time+takeoff_time+fly_time){    
00108                 
00109 
00110                         if((double)ros::Time::now().toSec()< start_time+takeoff_time+fly_time/2){
00111                         pub_twist.publish(twist_msg);
00112                         ROS_INFO("Flying +ve");
00113 
00114                         }//fly according to desired twist
00115                         
00116                         if((double)ros::Time::now().toSec()> start_time+takeoff_time+fly_time/2){
00117                         pub_twist.publish(twist_msg_neg);
00118                         ROS_INFO("Flying -ve");
00119 
00120                         }//fly according to desired twist
00121                         
00122                         ros::spinOnce();
00123                 loop_rate.sleep();
00124                         }
00125 
00126         ros::spinOnce();
00127         loop_rate.sleep();
00128 
00129 }//ros::ok
00130 
00131 }//main


arl_ardrone_examples
Author(s): parcon
autogenerated on Mon Jan 6 2014 11:03:12