From 13d6ffd60be0929ccffd657ab7ddab12d2a1097f Mon Sep 17 00:00:00 2001
From: roangel <roangel@student.ethz.ch>
Date: Mon, 4 Sep 2017 15:09:44 +0200
Subject: [PATCH] added a different link to set the setpoint for GUI, so that
 PPSClient decides in the end which setpoint to use. Difference between
 high-level setpoint and low-level setpoint

---
 .../GUI_Qt/studentGUI/include/MainWindow.h    |  2 +-
 .../GUI_Qt/studentGUI/src/MainWindow.cpp      |  5 +-
 .../GUI_Qt/studentGUI/src/MainWindow.ui       |  7 ++
 pps_ws/src/d_fall_pps/src/PPSClient.cpp       | 71 +++++++++++++------
 4 files changed, 62 insertions(+), 23 deletions(-)

diff --git a/pps_ws/src/d_fall_pps/GUI_Qt/studentGUI/include/MainWindow.h b/pps_ws/src/d_fall_pps/GUI_Qt/studentGUI/include/MainWindow.h
index b7d297d0..ca47a90e 100644
--- a/pps_ws/src/d_fall_pps/GUI_Qt/studentGUI/include/MainWindow.h
+++ b/pps_ws/src/d_fall_pps/GUI_Qt/studentGUI/include/MainWindow.h
@@ -98,7 +98,7 @@ private:
     ros::Subscriber CFBatterySubscriber;
     ros::Subscriber flyingStateSubscriber;
 
-    ros::Publisher setpointPublisher;
+    ros::Publisher controllerSetpointPublisher;
     ros::Subscriber setpointSubscriber;
 
     ros::Subscriber DBChangedSubscriber;
diff --git a/pps_ws/src/d_fall_pps/GUI_Qt/studentGUI/src/MainWindow.cpp b/pps_ws/src/d_fall_pps/GUI_Qt/studentGUI/src/MainWindow.cpp
index 33ba1e8f..2792f85b 100644
--- a/pps_ws/src/d_fall_pps/GUI_Qt/studentGUI/src/MainWindow.cpp
+++ b/pps_ws/src/d_fall_pps/GUI_Qt/studentGUI/src/MainWindow.cpp
@@ -38,11 +38,12 @@ MainWindow::MainWindow(int argc, char **argv, QWidget *parent) :
 
     flyingStateSubscriber = nodeHandle.subscribe("PPSClient/flyingState", 1, &MainWindow::flyingStateChangedCallback, this);
 
-    setpointPublisher = nodeHandle.advertise<Setpoint>("SafeControllerService/Setpoint", 1);
+
     setpointSubscriber = nodeHandle.subscribe("SafeControllerService/Setpoint", 1, &MainWindow::setpointCallback, this);
     DBChangedSubscriber = nodeHandle.subscribe("/my_GUI/DBChanged", 1, &MainWindow::DBChangedCallback, this);
 
     ros::NodeHandle my_nodeHandle("~");
+    controllerSetpointPublisher = my_nodeHandle.advertise<Setpoint>("ControllerSetpoint", 1);
     customYAMLloadedPublisher = my_nodeHandle.advertise<std_msgs::Int32>("customYAMLloaded", 1);
     safeYAMLloadedPublisher = my_nodeHandle.advertise<std_msgs::Int32>("safeYAMLloaded", 1);
 
@@ -325,7 +326,7 @@ void MainWindow::on_set_setpoint_button_clicked()
     msg_setpoint.z = (ui->new_setpoint_z->text()).toFloat();
     msg_setpoint.yaw = (ui->new_setpoint_yaw->text()).toFloat() * DEG2RAD;
 
-    this->setpointPublisher.publish(msg_setpoint);
+    this->controllerSetpointPublisher.publish(msg_setpoint);
 }
 
 void MainWindow::on_pushButton_3_clicked()
diff --git a/pps_ws/src/d_fall_pps/GUI_Qt/studentGUI/src/MainWindow.ui b/pps_ws/src/d_fall_pps/GUI_Qt/studentGUI/src/MainWindow.ui
index e0bf6fba..69c5a8d2 100644
--- a/pps_ws/src/d_fall_pps/GUI_Qt/studentGUI/src/MainWindow.ui
+++ b/pps_ws/src/d_fall_pps/GUI_Qt/studentGUI/src/MainWindow.ui
@@ -326,6 +326,13 @@
              </property>
             </widget>
            </item>
+           <item row="1" column="0">
+            <widget class="QPushButton" name="load_safe_yaml_button">
+             <property name="text">
+              <string>Load YAML file</string>
+             </property>
+            </widget>
+           </item>
           </layout>
          </widget>
          <widget class="QWidget" name="tab_4">
diff --git a/pps_ws/src/d_fall_pps/src/PPSClient.cpp b/pps_ws/src/d_fall_pps/src/PPSClient.cpp
index 238b62d0..e212fe83 100755
--- a/pps_ws/src/d_fall_pps/src/PPSClient.cpp
+++ b/pps_ws/src/d_fall_pps/src/PPSClient.cpp
@@ -77,6 +77,8 @@ ros::ServiceClient customController;
 bool strictSafety;
 float angleMargin;
 
+Setpoint controller_setpoint;
+
 ros::ServiceClient centralManager;
 ros::Publisher controlCommandPublisher;
 
@@ -260,25 +262,24 @@ void landTimerCallback(const ros::TimerEvent&)
     finished_land = true;
 }
 
-void goToDefaultSetpoint()
+void goToControllerSetpoint()
 {
-    std::vector<float> default_setpoint(4);
-    ros::NodeHandle nh_safeControllerService(ros_namespace + "/SafeControllerService");
-
-    ROS_INFO_STREAM(ros_namespace << "/SafeControllerService");
-
-    if(!nh_safeControllerService.getParam("defaultSetpoint", default_setpoint))
-    {
-        ROS_ERROR_STREAM("couldn't find parameter 'defaultSetpoint'");
-    }
-
-    Setpoint setpoint_msg;
-    setpoint_msg.x = default_setpoint[0];
-    setpoint_msg.y = default_setpoint[1];
-    setpoint_msg.z = default_setpoint[2];
-    ROS_INFO_STREAM("Z =" << default_setpoint[2]);
-    setpoint_msg.yaw = default_setpoint[3];
-    safeControllerServiceSetpointPublisher.publish(setpoint_msg);
+    // std::vector<float> default_setpoint(4);
+    // ros::NodeHandle nh_safeControllerService(ros_namespace + "/SafeControllerService");
+
+    // ROS_INFO_STREAM(ros_namespace << "/SafeControllerService");
+
+    // if(!nh_safeControllerService.getParam("defaultSetpoint", default_setpoint))
+    // {
+    //     ROS_ERROR_STREAM("couldn't find parameter 'defaultSetpoint'");
+    // }
+
+    // Setpoint setpoint_msg;
+    // setpoint_msg.y = default_setpoint[1];
+    // setpoint_msg.z = default_setpoint[2];
+    // ROS_INFO_STREAM("Z =" << default_setpoint[2]);
+    // setpoint_msg.yaw = default_setpoint[3];
+    safeControllerServiceSetpointPublisher.publish(controller_setpoint);
 }
 
 //is called when new data from Vicon arrives
@@ -323,8 +324,8 @@ void viconCallback(const ViconData& viconData) {
                     if(changed_state_flag) // stuff that will be run only once when changing state
                     {
                         changed_state_flag = false;
-                        // need to change setpoint to the one from file
-                        goToDefaultSetpoint();
+                        // need to change setpoint to the controller one
+                        goToControllerSetpoint();
                         ROS_INFO("STATE_FLYING");
                     }
                     break;
@@ -502,12 +503,41 @@ void crazyRadioStatusCallback(const std_msgs::Int32& msg)
     crazyradio_status = msg.data;
 }
 
+void controllerSetPointCallback(const Setpoint& newSetpoint)
+{
+    // load in variable the setpoint
+    controller_setpoint = newSetpoint;
+
+    // if we are in flying, set it up NOW
+    if(flying_state == STATE_FLYING)
+    {
+        goToControllerSetpoint();
+    }
+}
+
 int main(int argc, char* argv[])
 {
 	ros::init(argc, argv, "PPSClient");
 	ros::NodeHandle nodeHandle("~");
     ros_namespace = ros::this_node::getNamespace();
 
+    // load default setpoint
+    std::vector<float> default_setpoint(4);
+    ros::NodeHandle nh_safeControllerService(ros_namespace + "/SafeControllerService");
+
+    ROS_INFO_STREAM(ros_namespace << "/SafeControllerService");
+
+    if(!nh_safeControllerService.getParam("defaultSetpoint", default_setpoint))
+    {
+        ROS_ERROR_STREAM("couldn't find parameter 'defaultSetpoint'");
+    }
+
+    controller_setpoint.x = default_setpoint[0];
+    controller_setpoint.y = default_setpoint[1];
+    controller_setpoint.z = default_setpoint[2];
+    controller_setpoint.yaw = default_setpoint[3];
+
+    // load context parameters
 	loadParameters(nodeHandle);
 
 	//ros::service::waitForService("/CentralManagerService/CentralManager");
@@ -542,6 +572,7 @@ int main(int argc, char* argv[])
     // SafeControllerServicePublisher:
     ros::NodeHandle namespaceNodeHandle = ros::NodeHandle();
     safeControllerServiceSetpointPublisher = namespaceNodeHandle.advertise<d_fall_pps::Setpoint>("SafeControllerService/Setpoint", 1);
+    ros::Subscriber controllerSetpointSubscriber = namespaceNodeHandle.subscribe("student_GUI/ControllerSetpoint", 1, controllerSetPointCallback);
 
     // subscriber for DBChanged
     ros::Subscriber DBChangedSubscriber = namespaceNodeHandle.subscribe("/my_GUI/DBChanged", 1, DBChangedCallback);
-- 
GitLab