From 58a3fd697e8e85f9103e443a8c7bbebc2b7e1c5f Mon Sep 17 00:00:00 2001 From: roangel <roangel@student.ethz.ch> Date: Thu, 17 Aug 2017 10:18:49 +0200 Subject: [PATCH] Added some changes to try downstairs: Scale factor 1.2, take into account occluded flag in controller, Z origin is now 0, table, not middle of box --- .../GUI_Qt/CrazyFlyGUI/include/crazyFly.h | 4 +- pps_ws/src/d_fall_pps/src/PPSClient.cpp | 113 +++++++++--------- 2 files changed, 61 insertions(+), 56 deletions(-) diff --git a/pps_ws/src/d_fall_pps/GUI_Qt/CrazyFlyGUI/include/crazyFly.h b/pps_ws/src/d_fall_pps/GUI_Qt/CrazyFlyGUI/include/crazyFly.h index 8f97fca5..aad2f1de 100644 --- a/pps_ws/src/d_fall_pps/GUI_Qt/CrazyFlyGUI/include/crazyFly.h +++ b/pps_ws/src/d_fall_pps/GUI_Qt/CrazyFlyGUI/include/crazyFly.h @@ -14,8 +14,8 @@ using namespace d_fall_pps; #endif -#define DRONE_HEIGHT 100 * FROM_MILIMETERS_TO_UNITS -#define DRONE_WIDTH 100 * FROM_MILIMETERS_TO_UNITS +#define DRONE_HEIGHT 100 * FROM_MILIMETERS_TO_UNITS * 1.2 +#define DRONE_WIDTH 100 * FROM_MILIMETERS_TO_UNITS * 1.2 class crazyFly : public QGraphicsSvgItem { diff --git a/pps_ws/src/d_fall_pps/src/PPSClient.cpp b/pps_ws/src/d_fall_pps/src/PPSClient.cpp index 225e4d5d..28f16700 100755 --- a/pps_ws/src/d_fall_pps/src/PPSClient.cpp +++ b/pps_ws/src/d_fall_pps/src/PPSClient.cpp @@ -94,7 +94,7 @@ bool safetyCheck(CrazyflieData data, ControlCommand controlCommand) { return false; } } - + return true; } @@ -102,7 +102,9 @@ void coordinatesToLocal(CrazyflieData& cf) { AreaBounds area = context.localArea; float originX = (area.xmin + area.xmax) / 2.0; float originY = (area.ymin + area.ymax) / 2.0; - float originZ = (area.zmin + area.zmax) / 2.0; + // change Z origin to zero, i.e., to the table height, zero of global coordinates, instead of middle of the box + float originZ = 0.0; + // float originZ = (area.zmin + area.zmax) / 2.0; cf.x -= originX; cf.y -= originY; @@ -113,52 +115,55 @@ void coordinatesToLocal(CrazyflieData& cf) { void viconCallback(const ViconData& viconData) { for(std::vector<CrazyflieData>::const_iterator it = viconData.crazyflies.begin(); it != viconData.crazyflies.end(); ++it) { CrazyflieData global = *it; - - if(global.crazyflieName == context.crazyflieName) { - Controller controllerCall; - - CrazyflieData local = global; - coordinatesToLocal(local); - controllerCall.request.ownCrazyflie = local; - - if(crazyflieEnabled){ - if(!usingSafeController) { - bool success = customController.call(controllerCall); - - if(!success) { - ROS_ERROR("Failed to call custom controller, switching to safe controller"); - ROS_ERROR_STREAM("custom controller status: valid: " << customController.isValid() << ", exists: " << customController.exists()); - ROS_ERROR_STREAM("custom controller name: " << customController.getService()); - usingSafeController = true; - } else if(!safetyCheck(global, controllerCall.response.controlOutput)) { - usingSafeController = true; - ROS_INFO_STREAM("safety check failed, switching to safe controller"); - } - } - - - if(usingSafeController) { - bool success = safeController.call(controllerCall); - if(!success) { - ROS_ERROR_STREAM("Failed to call safe controller, valid: " << safeController.isValid() << ", exists: " << safeController.exists()); - } - } - - //ROS_INFO_STREAM("safe controller active: " << usingSafeController); - - controlCommandPublisher.publish(controllerCall.response.controlOutput); - - bag.write("ViconData", ros::Time::now(), local); - bag.write("ControlOutput", ros::Time::now(), controllerCall.response.controlOutput); - - } else { //crazyflie disabled - ControlCommand zeroOutput = ControlCommand(); //everything set to zero - zeroOutput.onboardControllerType = 2; //set to motor_mode - controlCommandPublisher.publish(zeroOutput); - bag.write("ViconData", ros::Time::now(), local); - bag.write("ControlOutput", ros::Time::now(), zeroOutput); - } - } + + if(!global.occluded) //if it is not occluded, then proceed to compute the controller output + { + if(global.crazyflieName == context.crazyflieName) { + Controller controllerCall; + + CrazyflieData local = global; + coordinatesToLocal(local); + controllerCall.request.ownCrazyflie = local; + + if(crazyflieEnabled){ + if(!usingSafeController) { + bool success = customController.call(controllerCall); + + if(!success) { + ROS_ERROR("Failed to call custom controller, switching to safe controller"); + ROS_ERROR_STREAM("custom controller status: valid: " << customController.isValid() << ", exists: " << customController.exists()); + ROS_ERROR_STREAM("custom controller name: " << customController.getService()); + usingSafeController = true; + } else if(!safetyCheck(global, controllerCall.response.controlOutput)) { + usingSafeController = true; + ROS_INFO_STREAM("safety check failed, switching to safe controller"); + } + } + + + if(usingSafeController) { + bool success = safeController.call(controllerCall); + if(!success) { + ROS_ERROR_STREAM("Failed to call safe controller, valid: " << safeController.isValid() << ", exists: " << safeController.exists()); + } + } + + //ROS_INFO_STREAM("safe controller active: " << usingSafeController); + + controlCommandPublisher.publish(controllerCall.response.controlOutput); + + bag.write("ViconData", ros::Time::now(), local); + bag.write("ControlOutput", ros::Time::now(), controllerCall.response.controlOutput); + + } else { //crazyflie disabled + ControlCommand zeroOutput = ControlCommand(); //everything set to zero + zeroOutput.onboardControllerType = 2; //set to motor_mode + controlCommandPublisher.publish(zeroOutput); + bag.write("ViconData", ros::Time::now(), local); + bag.write("ControlOutput", ros::Time::now(), zeroOutput); + } + } + } } } @@ -182,7 +187,7 @@ void loadCrazyflieContext() { CMQuery contextCall; contextCall.request.studentID = studentID; ROS_INFO_STREAM("StudentID:" << studentID); - + centralManager.waitForExistence(ros::Duration(-1)); if(centralManager.call(contextCall)) { @@ -254,16 +259,16 @@ int main(int argc, char* argv[]){ ros::init(argc, argv, "PPSClient"); ros::NodeHandle nodeHandle("~"); loadParameters(nodeHandle); - - + + //ros::service::waitForService("/CentralManagerService/CentralManager"); centralManager = nodeHandle.serviceClient<CMQuery>("/CentralManagerService/Query", false); loadCrazyflieContext(); - + //keeps 100 messages because otherwise ViconDataPublisher would override the data immediately ros::Subscriber viconSubscriber = nodeHandle.subscribe("/ViconDataPublisher/ViconData", 100, viconCallback); ROS_INFO_STREAM("successfully subscribed to ViconData"); - + //ros::Publishers to advertise the control output controlCommandPublisher = nodeHandle.advertise <ControlCommand>("ControlCommand", 1); @@ -275,7 +280,7 @@ int main(int argc, char* argv[]){ crazyflieEnabled = true; usingSafeController = true; loadSafeController(); - + std::string package_path; package_path = ros::package::getPath("d_fall_pps") + "/"; ROS_INFO_STREAM(package_path); -- GitLab