|
|
|
@ -109,10 +109,11 @@ void FormationClass::leader1(float x,float y){
|
|
|
|
|
|
|
|
|
|
|
|
void FormationClass::follower1(int type){
|
|
|
|
void FormationClass::follower1(int type){
|
|
|
|
|
|
|
|
|
|
|
|
std::string command,pre_command = "";
|
|
|
|
std::string command = "";
|
|
|
|
|
|
|
|
std::string pre_command = receiver_object.check_command();
|
|
|
|
int message;
|
|
|
|
int message;
|
|
|
|
while(true){
|
|
|
|
while(true){
|
|
|
|
|
|
|
|
|
|
|
|
if(type == 0){
|
|
|
|
if(type == 0){
|
|
|
|
calculate_position(4,30);
|
|
|
|
calculate_position(4,30);
|
|
|
|
}else if(type == 1){
|
|
|
|
}else if(type == 1){
|
|
|
|
@ -130,12 +131,13 @@ void FormationClass::follower1(int type){
|
|
|
|
command = receiver_object.check_command();
|
|
|
|
command = receiver_object.check_command();
|
|
|
|
// message = request_object.get_formation_message();
|
|
|
|
// message = request_object.get_formation_message();
|
|
|
|
// ROS_INFO("%d",message);
|
|
|
|
// ROS_INFO("%d",message);
|
|
|
|
|
|
|
|
// std::cout<<command<<std::endl;
|
|
|
|
|
|
|
|
// std::cout<<"/"<<pre_command<<std::endl;
|
|
|
|
|
|
|
|
|
|
|
|
if(command != pre_command ){
|
|
|
|
if(command != pre_command ){
|
|
|
|
// ROS_INFO("change formation");
|
|
|
|
ROS_INFO("change formation");
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
pre_command = command;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -437,8 +439,8 @@ void FormationClass::calculate_position(float k,float theta,int direction){
|
|
|
|
// float error_x = PID_x.update1(follower_location.lon*1e5 , Pf[0] ); //caculate error
|
|
|
|
// float error_x = PID_x.update1(follower_location.lon*1e5 , Pf[0] ); //caculate error
|
|
|
|
// float error_y = PID_y.update1(follower_location.lat*1e5 , Pf[1] );
|
|
|
|
// float error_y = PID_y.update1(follower_location.lat*1e5 , Pf[1] );
|
|
|
|
|
|
|
|
|
|
|
|
// float error_x = Pf[0] - (follower_location.lon*1e+5); //caculate error
|
|
|
|
float error_lon = Pf[0] - (follower_location.lon*1e+5); //caculate error
|
|
|
|
// float error_y = Pf[1] - (follower_location.lat*1e+5);
|
|
|
|
float error_lat = Pf[1] - (follower_location.lat*1e+5);
|
|
|
|
|
|
|
|
|
|
|
|
float error_degree = deg_phi - heading + direction;
|
|
|
|
float error_degree = deg_phi - heading + direction;
|
|
|
|
float error_yaw = 0.2; //CCW
|
|
|
|
float error_yaw = 0.2; //CCW
|
|
|
|
@ -452,11 +454,11 @@ void FormationClass::calculate_position(float k,float theta,int direction){
|
|
|
|
|
|
|
|
|
|
|
|
error_yaw = check_direction(error_degree)*error_yaw; //check yaw direction
|
|
|
|
error_yaw = check_direction(error_degree)*error_yaw; //check yaw direction
|
|
|
|
|
|
|
|
|
|
|
|
if (error_x < 0.3 && error_x > -0.3){ //ignore small errors
|
|
|
|
if (error_lon < ignore_small && error_lon > -ignore_small){ //ignore small errors
|
|
|
|
error_x = 0;
|
|
|
|
error_lon = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (error_y < 0.3 && error_y > -0.3){
|
|
|
|
if (error_lat < ignore_small && error_lat > -ignore_small){
|
|
|
|
error_y = 0;
|
|
|
|
error_lat = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (error_degree < 5 && error_degree > -5 ){
|
|
|
|
if (error_degree < 5 && error_degree > -5 ){
|
|
|
|
error_yaw = 0;
|
|
|
|
error_yaw = 0;
|
|
|
|
@ -468,13 +470,14 @@ void FormationClass::calculate_position(float k,float theta,int direction){
|
|
|
|
// ROS_INFO("%f,%f",follower_location.lon*1e+5 ,follower_location.lat*1e+5);
|
|
|
|
// ROS_INFO("%f,%f",follower_location.lon*1e+5 ,follower_location.lat*1e+5);
|
|
|
|
// ROS_INFO("%f,%f",Pf[0],Pf[1]);
|
|
|
|
// ROS_INFO("%f,%f",Pf[0],Pf[1]);
|
|
|
|
// ROS_INFO("%f,%f",error_x,error_y);
|
|
|
|
// ROS_INFO("%f,%f",error_x,error_y);
|
|
|
|
|
|
|
|
// ROS_INFO("%f,%f",error_lon,error_lat);
|
|
|
|
// ROS_INFO("deg:%f",deg_phi);
|
|
|
|
// ROS_INFO("deg:%f",deg_phi);
|
|
|
|
// ROS_INFO("heading:%f",heading);
|
|
|
|
// ROS_INFO("heading:%f",heading);
|
|
|
|
// ROS_INFO("error_degree:%f",error_degree);
|
|
|
|
// ROS_INFO("error_degree:%f",error_degree);
|
|
|
|
// ROS_INFO("error_yaw:%f",error_yaw);
|
|
|
|
// ROS_INFO("error_yaw:%f",error_yaw);
|
|
|
|
// ROS_INFO("************************************");
|
|
|
|
// ROS_INFO("************************************");
|
|
|
|
|
|
|
|
|
|
|
|
command_object.set_velocity(error_x,error_y,0,error_yaw,0.1);
|
|
|
|
command_object.set_velocity(error_lon,error_lat,0,error_yaw,0.1);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@ -548,7 +551,7 @@ void FormationClass::spherical_coordinate(float k,float theta,float psi){
|
|
|
|
// ROS_INFO("%f,%f",leader_location.lon/100 ,leader_location.lat/100);
|
|
|
|
// ROS_INFO("%f,%f",leader_location.lon/100 ,leader_location.lat/100);
|
|
|
|
// ROS_INFO("%f,%f",follower_location.lon*1e+5 ,follower_location.lat*1e+5);
|
|
|
|
// ROS_INFO("%f,%f",follower_location.lon*1e+5 ,follower_location.lat*1e+5);
|
|
|
|
// ROS_INFO("%f,%f",Pf[0],Pf[1]);
|
|
|
|
// ROS_INFO("%f,%f",Pf[0],Pf[1]);
|
|
|
|
// ROS_INFO("%f,%f",error_x,error_y);
|
|
|
|
ROS_INFO("%f,%f",error_x,error_y);
|
|
|
|
// ROS_INFO("deg:%f",deg_phi);
|
|
|
|
// ROS_INFO("deg:%f",deg_phi);
|
|
|
|
// ROS_INFO("heading:%f",heading);
|
|
|
|
// ROS_INFO("heading:%f",heading);
|
|
|
|
// ROS_INFO("error_degree:%f",error_degree);
|
|
|
|
// ROS_INFO("error_degree:%f",error_degree);
|
|
|
|
|