combine compass and velocity into topic DroneStatus

protobuf
Xuan0319 3 years ago
parent f2d16b78a2
commit 9e32d5168d

@ -255,11 +255,16 @@ target_include_directories(PID_lib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
target_link_libraries(PID_lib ${catkin_LIBRARIES})
add_dependencies(PID_lib main_generate_messages_cpp)
add_library(PubData_lib ${CMAKE_CURRENT_SOURCE_DIR}/src/PubData.cpp)
target_include_directories(PubData_lib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
target_link_libraries(PubData_lib ${catkin_LIBRARIES})
add_dependencies(PubData_lib main_generate_messages_cpp)
##################
add_library(formation_lib ${CMAKE_CURRENT_SOURCE_DIR}/src/formation.cpp)
target_include_directories(formation_lib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
target_link_libraries(formation_lib ${catkin_LIBRARIES} sensor_lib mode_lib control_lib command_lib requestData_lib PID_lib)
target_link_libraries(formation_lib ${catkin_LIBRARIES} sensor_lib mode_lib control_lib command_lib requestData_lib PID_lib PubData_lib)
add_dependencies(formation_lib main_generate_messages_cpp)
add_library(select_lib ${CMAKE_CURRENT_SOURCE_DIR}/src/select.cpp)

@ -0,0 +1,39 @@
/*Publish Compass & velocity data to topic "DroneStatus"*/
#ifndef PUBDATA_H
#define PUBDATA_H
#include <ros/ros.h>
#include <sensor_msgs/NavSatFix.h>
#include <std_msgs/Float64.h>
#include <mavros_msgs/Waypoint.h>
#include "class_model/velocity.h"
class PubDataClass {
public:
PubDataClass();
virtual ~PubDataClass();
void publishData(velocity v);
private:
// ROS NodeHandle
ros::NodeHandle node_handle_;
//SUBSCRIBE
ros::Subscriber Compass;
//PUBLISH
ros::Publisher PubData;
mavros_msgs::Waypoint msg;
float heading;
void Compass_callback(const std_msgs::Float64::ConstPtr &degree);
};
#endif // PUBDATA_H

@ -10,6 +10,7 @@
#include "class_model/command.h"
#include "class_model/requestData.h"
#include "class_model/PID.h"
#include "class_model/PubData.h"
#include <std_msgs/String.h>
@ -25,6 +26,7 @@ public:
ControlClass control_object;
CommandClass command_object;
RequestClass request_object;
PubDataClass PubData_object;
PIDClass PID_x;
PIDClass PID_y;
@ -48,6 +50,7 @@ private:
global_location follower_location;
global_location leader_location;
global_location current_location;
velocity drone_speed;
int flag = 0,heading_status = 0;
float pre_alt,cur_alt;
float leader_pid[3] = {0.5 , 0.000000000001 ,0.5};

@ -0,0 +1,8 @@
#ifndef VELOCITY_H
#define VELOCITY_H
typedef struct velocity{
float x,y;
}velocity;
#endif // VELOCITY_H

@ -0,0 +1,32 @@
#include "class_model/PubData.h"
PubDataClass::PubDataClass() : node_handle_("~"){
std::string ros_namespace;
if (!node_handle_.hasParam("namespace"))
{
}else{
node_handle_.getParam("namespace", ros_namespace);
}
PubData=node_handle_.advertise<mavros_msgs::Waypoint>(ros_namespace+"/DroneStatus",100);
Compass=node_handle_.subscribe(ros_namespace+"/mavros/global_position/compass_hdg", 10,
&PubDataClass::Compass_callback, this);
}
PubDataClass::~PubDataClass() { ros::shutdown(); }
void PubDataClass::publishData(velocity v){
msg.param2 = v.x;
msg.param3 = v.y;
PubData.publish(msg);
ROS_INFO("pub drone status");
}
void PubDataClass::Compass_callback(const std_msgs::Float64::ConstPtr &degree){
msg.param1 = degree->data;
}

@ -578,25 +578,26 @@ void FormationClass::go2target(float x,float y){
face2target(target_heading);
}
float error_x = PID_x.update(current_location.lon*1e5 , target_location.lon ,leader_pid); //leader_pid defined in header file
float error_y = PID_y.update(current_location.lat*1e5 , target_location.lat ,leader_pid);
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 (error_x < 0.3 && error_x > -0.3){ //ignore small errors
error_x = 0;
if (drone_speed.x < 0.3 && drone_speed.x > -0.3){ //ignore small errors
drone_speed.x = 0;
}
if (error_y < 0.3 && error_y > -0.3){
error_y = 0;
if (drone_speed.y < 0.3 && drone_speed.y > -0.3){
drone_speed.y = 0;
}
if (error_x == 0 && error_y == 0){
if (drone_speed.x == 0 && drone_speed.y == 0){
flag = 1;
}
command_object.set_velocity(error_x ,error_y ,0,0,0.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",error_x,error_y);
// ROS_INFO("heading:%f,target_heading:%f",heading,target_heading);

@ -1,5 +1,6 @@
#include "class_model/mission.h"
#include "class_model/choose_leader.h"
#include "class_model/PubData.h"
int main(int argc, char **argv) {
@ -15,6 +16,9 @@ int main(int argc, char **argv) {
ReceiverClass receiver_object;
MissionClass mission_object;
CommandClass command_object;
SelectClass select_formation;
PubDataClass PubData_object;
// SelectionClass selection_object;
@ -28,8 +32,9 @@ int main(int argc, char **argv) {
while(ros::ok()){
//json_object.get_command(); //for follower
//json_object.get_command(); //for follower
select_formation.goose_formation();
}
ros::waitForShutdown();

Loading…
Cancel
Save