sub 3 drone work, but too slow
parent
58a2f3e7c1
commit
02bff86b0e
@ -0,0 +1,123 @@
|
||||
#include "class_model/Leader.h"
|
||||
#include "class_model/convert_degree.h"
|
||||
|
||||
LeaderClass::LeaderClass() : node_handle_(""){
|
||||
|
||||
}
|
||||
|
||||
LeaderClass::~LeaderClass() { ros::shutdown(); }
|
||||
|
||||
void LeaderClass::leader(global_location target){
|
||||
|
||||
std::string command = "",pre_command = receiver_object.check_command();;
|
||||
std_msgs::String message;
|
||||
|
||||
target_location.lon = target.lon*1e5;
|
||||
target_location.lat = target.lat*1e5;
|
||||
sleep(3);
|
||||
flag = 0;
|
||||
heading_status = 0;
|
||||
while(true){
|
||||
if(flag==0){
|
||||
go2target(target.lon,target.lat);
|
||||
}else{
|
||||
// next_command.publish(message);
|
||||
ROS_INFO("break");
|
||||
break;
|
||||
}
|
||||
|
||||
command = receiver_object.check_command();
|
||||
while(command =="stop" || command == "land"){
|
||||
// command_object.set_velocity(0,0,0,0,1);
|
||||
// command = receiver_object.check_command();
|
||||
|
||||
if(command == "land"){
|
||||
mode_object.set_Mode("LAND");
|
||||
}else if(command != "stop"){
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if(command != pre_command){
|
||||
// ROS_INFO("change formation");
|
||||
break;
|
||||
}
|
||||
pre_command = command;
|
||||
}
|
||||
}
|
||||
|
||||
void LeaderClass::go2target(float x,float y){
|
||||
|
||||
current_location=GPS_object.gps_position();
|
||||
|
||||
float target_heading,error_heading;
|
||||
float heading = GPS_object.get_heading();
|
||||
target_heading = ConvertDeg(x,y);
|
||||
|
||||
// float error_yaw = 0.2;
|
||||
// error_heading = target_heading - heading;
|
||||
// error_yaw = check_direction(error_heading)*error_yaw; //check yaw direction
|
||||
|
||||
while(heading_status != 1){
|
||||
face2target(target_heading);
|
||||
}
|
||||
|
||||
drone_speed.x = PID_x.update(current_location.lon*1e5 , target_location.lon ,leader_pid); //leader_pid defined in header file
|
||||
drone_speed.y = PID_y.update(current_location.lat*1e5 , target_location.lat ,leader_pid);
|
||||
|
||||
// float error_x = PID_x.update1(current_location.lon*1e5 , target_location.lon );
|
||||
// float error_y = PID_y.update1(current_location.lat*1e5 , target_location.lat );
|
||||
|
||||
if (drone_speed.x < ignore_small && drone_speed.x > -ignore_small){ //ignore small errors
|
||||
drone_speed.x = 0;
|
||||
}
|
||||
if (drone_speed.y < ignore_small && drone_speed.y > -ignore_small){
|
||||
drone_speed.y = 0;
|
||||
}
|
||||
if (drone_speed.x < -1){ //max velociy
|
||||
drone_speed.x = -1;
|
||||
}
|
||||
if (drone_speed.x > 1){
|
||||
drone_speed.x = 1;
|
||||
}
|
||||
if (drone_speed.y < -1){
|
||||
drone_speed.y = -1;
|
||||
}
|
||||
if (drone_speed.y > 1){
|
||||
drone_speed.y = 1;
|
||||
}
|
||||
|
||||
if (drone_speed.x == 0 && drone_speed.y == 0){
|
||||
flag = 1;
|
||||
}
|
||||
|
||||
PubData_object.publishData(drone_speed);
|
||||
command_object.set_velocity(drone_speed.x ,drone_speed.y ,0,0,0.1);
|
||||
|
||||
// ROS_INFO("slope:%f,%f,%f",slope,x,y);
|
||||
ROS_INFO("%f,%f",drone_speed.x,drone_speed.y);
|
||||
// ROS_INFO("heading:%f,target_heading:%f",heading,target_heading);
|
||||
// ROS_INFO("target:%f,%f",target_location.lon ,target_location.lat);
|
||||
// ROS_INFO("current:%f,%f",current_location.lon*1e5 ,current_location.lat*1e5);
|
||||
ROS_INFO("************************************");
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
void LeaderClass::face2target(float target_heading){
|
||||
|
||||
float error_heading;
|
||||
float heading = GPS_object.get_heading();
|
||||
float error_yaw = 0.2;
|
||||
error_heading = target_heading - heading;
|
||||
error_yaw = check_direction(error_heading)*error_yaw;
|
||||
|
||||
if (error_heading < 5 && error_heading > -5 ){
|
||||
error_yaw = 0;
|
||||
heading_status = 1;
|
||||
}
|
||||
command_object.set_velocity(0 ,0 ,0,error_yaw,0.1);
|
||||
ROS_INFO("face2target...");
|
||||
}
|
||||
Loading…
Reference in New Issue