From 1e87768dd0f65dbc4813b0cfd751f82856e4e874 Mon Sep 17 00:00:00 2001
From: roangel <roangel@student.ethz.ch>
Date: Fri, 1 Sep 2017 14:49:04 +0200
Subject: [PATCH] Need to test downstairs

---
 .../GUI_Qt/studentGUI/include/MainWindow.h    |  3 +
 .../GUI_Qt/studentGUI/src/MainWindow.cpp      | 71 +++++++++++--------
 .../GUI_Qt/studentGUI/studentGUI.pro.user     |  2 +-
 .../d_fall_pps/param/CustomController.yaml    |  0
 pps_ws/src/d_fall_pps/src/PPSClient.cpp       | 11 ---
 .../d_fall_pps/src/SafeControllerService.cpp  | 12 +++-
 6 files changed, 53 insertions(+), 46 deletions(-)
 create mode 100644 pps_ws/src/d_fall_pps/param/CustomController.yaml

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 b3aa5eeb..63cad337 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
@@ -84,6 +84,8 @@ private:
 
     std::string m_ros_namespace;
 
+    ros::Timer m_timer_yaml_file;
+
     int m_student_id;
     CrazyflieContext m_context;
 
@@ -108,6 +110,7 @@ private:
     void flyingStateChangedCallback(const std_msgs::Int32& msg);
     void setpointCallback(const Setpoint& newSetpoint);
     void DBChangedCallback(const std_msgs::Int32& msg);
+    void yamlFileTimerCallback(const ros::TimerEvent&);
 
     float fromVoltageToPercent(float voltage);
     void updateBatteryVoltage(float battery_voltage);
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 8eacfed7..db52fb06 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
@@ -67,6 +67,19 @@ MainWindow::MainWindow(int argc, char **argv, QWidget *parent) :
     qstr.append(QString::fromStdString(m_context.crazyflieName));
     ui->groupBox->setTitle(qstr);
 
+    std::vector<float> default_setpoint(4);
+    ros::NodeHandle nh_safeControllerService(m_ros_namespace + "/SafeControllerService");
+    if(!nh_safeControllerService.getParam("defaultSetPoint", default_setpoint))
+    {
+        ROS_ERROR_STREAM("couldn't find parameter 'defaultSetPoint'");
+    }
+
+
+    ui->current_setpoint_x->setText(QString::number(default_setpoint[0]));
+    ui->current_setpoint_y->setText(QString::number(default_setpoint[1]));
+    ui->current_setpoint_z->setText(QString::number(default_setpoint[2]));
+    ui->current_setpoint_yaw->setText(QString::number(default_setpoint[3]));
+
     disableGUI();
 }
 
@@ -254,15 +267,15 @@ void MainWindow::updateNewViconData(const ptrToMessage& p_msg) //connected to ne
             ui->current_x->setText(QString::number(local.x, 'f', 3));
             ui->current_y->setText(QString::number(local.y, 'f', 3));
             ui->current_z->setText(QString::number(local.z, 'f', 3));
-            ui->current_yaw->setText(QString::number(local.yaw * RAD2DEG, 'f', 3));
-            ui->current_pitch->setText(QString::number(local.pitch * RAD2DEG, 'f', 3));
-            ui->current_roll->setText(QString::number(local.roll * RAD2DEG, 'f', 3));
+            ui->current_yaw->setText(QString::number(local.yaw * RAD2DEG, 'f', 2));
+            ui->current_pitch->setText(QString::number(local.pitch * RAD2DEG, 'f', 2));
+            ui->current_roll->setText(QString::number(local.roll * RAD2DEG, 'f', 2));
 
             // also update diff
             ui->diff_x->setText(QString::number(m_setpoint.x - local.x, 'f', 3));
             ui->diff_y->setText(QString::number(m_setpoint.y - local.y, 'f', 3));
             ui->diff_z->setText(QString::number(m_setpoint.z - local.z, 'f', 3));
-            ui->diff_yaw->setText(QString::number((m_setpoint.yaw - local.yaw) * RAD2DEG, 'f', 3));
+            ui->diff_yaw->setText(QString::number((m_setpoint.yaw - local.yaw) * RAD2DEG, 'f', 2));
         }
     }
 }
@@ -315,28 +328,38 @@ void MainWindow::on_pushButton_3_clicked()
     ROS_INFO("command disconnect published");
 }
 
-void MainWindow::on_load_yaml_button_clicked()
+void MainWindow::yamlFileTimerCallback(const ros::TimerEvent&)
 {
-    
+
+    std::string d_fall_pps_path = ros::package::getPath("d_fall_pps");
+    ROS_INFO_STREAM(d_fall_pps_path);
+
+    // first, reload the name of the custom controller:
+    std::string cmd = "rosparam load " + d_fall_pps_path + "/param/ClientConfig.yaml " + m_ros_namespace + "/PPSClient";
+
+    system(cmd.c_str());
+    ROS_INFO_STREAM(cmd);
+
+    // then, reload the parameters of the custom controller:
+    cmd = "rosparam load " + d_fall_pps_path + "/param/CustomController.yaml " + m_ros_namespace + "/CustomControllerService";
+
+    system(cmd.c_str());
+    ROS_INFO_STREAM(cmd);
+    ui->load_yaml_button->setEnabled(true);
 }
 
-void loadParameterFloatVector(ros::NodeHandle& nodeHandle, std::string name, std::vector<float>& val, int length)
+void MainWindow::on_load_yaml_button_clicked()
 {
-    if(!nodeHandle.getParam(name, val))
-    {
-        ROS_ERROR_STREAM("missing parameter '" << name << "'");
-    }
-    if(val.size() != length)
-    {
-        ROS_ERROR_STREAM("parameter '" << name << "' has wrong array length, " << length << " needed");
-    }
+    ros::NodeHandle nodeHandle("~");
+    m_timer_yaml_file = nodeHandle.createTimer(ros::Duration(0.5), &MainWindow::yamlFileTimerCallback, this, true);
+    ui->load_yaml_button->setEnabled(false);
 }
 
 void MainWindow::on_en_custom_controller_clicked()
 {
     std_msgs::Int32 msg;
     msg.data = CMD_USE_CUSTOM_CONTROLLER;
-    // this->PPSClientCommandPublisher.publish(msg);
+    this->PPSClientCommandPublisher.publish(msg);
 }
 
 
@@ -344,19 +367,5 @@ void MainWindow::on_en_safe_controller_clicked()
 {
     std_msgs::Int32 msg;
     msg.data = CMD_USE_SAFE_CONTROLLER;
-
-
-    std::string d_fall_pps_path = ros::package::getPath("d_fall_pps");
-    ROS_INFO_STREAM(d_fall_pps_path);
-
-    std::string cmd = "rosparam load " + d_fall_pps_path + "/param/SafeController.yaml " + m_ros_namespace + "/SafeControllerService";
-
-    system(cmd.c_str());
-    ROS_INFO_STREAM(cmd);
-
-    std::vector<float> setpoint(4);
-    ros::NodeHandle nodeHandle(m_ros_namespace + "/SafeControllerService");
-    loadParameterFloatVector(nodeHandle, "defaultSetpoint", setpoint, 4);
-    ROS_INFO_STREAM("setpoint z:" << setpoint[2]);
-    // this->PPSClientCommandPublisher.publish(msg);
+    this->PPSClientCommandPublisher.publish(msg);
 }
diff --git a/pps_ws/src/d_fall_pps/GUI_Qt/studentGUI/studentGUI.pro.user b/pps_ws/src/d_fall_pps/GUI_Qt/studentGUI/studentGUI.pro.user
index 470dfb69..684c0e67 100644
--- a/pps_ws/src/d_fall_pps/GUI_Qt/studentGUI/studentGUI.pro.user
+++ b/pps_ws/src/d_fall_pps/GUI_Qt/studentGUI/studentGUI.pro.user
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE QtCreatorProject>
-<!-- Written by QtCreator 4.0.2, 2017-08-29T18:10:33. -->
+<!-- Written by QtCreator 4.0.2, 2017-09-01T14:47:27. -->
 <qtcreator>
  <data>
   <variable>EnvironmentId</variable>
diff --git a/pps_ws/src/d_fall_pps/param/CustomController.yaml b/pps_ws/src/d_fall_pps/param/CustomController.yaml
new file mode 100644
index 00000000..e69de29b
diff --git a/pps_ws/src/d_fall_pps/src/PPSClient.cpp b/pps_ws/src/d_fall_pps/src/PPSClient.cpp
index db9d0580..4bfcbed9 100755
--- a/pps_ws/src/d_fall_pps/src/PPSClient.cpp
+++ b/pps_ws/src/d_fall_pps/src/PPSClient.cpp
@@ -223,16 +223,6 @@ void landCF(CrazyflieData& current_local_coordinates)
     loadSafeController();
 }
 
-void goToOrigin()
-{
-    Setpoint setpoint_msg;
-    setpoint_msg.x = 0;
-    setpoint_msg.y = 0;
-    setpoint_msg.z = 0.4;
-    setpoint_msg.yaw = 0;
-    safeControllerServiceSetpointPublisher.publish(setpoint_msg);
-}
-
 void changeFlyingStateTo(int new_state)
 {
     if(crazyradio_status == CONNECTED)
@@ -311,7 +301,6 @@ void viconCallback(const ViconData& viconData) {
                     {
                         changed_state_flag = false;
                         // need to change setpoint to the one from file
-                        goToOrigin();
                         ROS_INFO("STATE_FLYING");
                     }
                     break;
diff --git a/pps_ws/src/d_fall_pps/src/SafeControllerService.cpp b/pps_ws/src/d_fall_pps/src/SafeControllerService.cpp
index ea4c5cc6..568f11d4 100755
--- a/pps_ws/src/d_fall_pps/src/SafeControllerService.cpp
+++ b/pps_ws/src/d_fall_pps/src/SafeControllerService.cpp
@@ -49,6 +49,7 @@ std::vector<float> estimatorMatrix(2);
 float prevEstimate[9];
 
 std::vector<float>  setpoint(4);
+std::vector<float> defaultSetpoint(4);
 float saturationThrust;
 
 CrazyflieData previousLocation;
@@ -82,7 +83,7 @@ void loadParameters(ros::NodeHandle& nodeHandle) {
     loadParameterFloatVector(nodeHandle, "filterGain", filterGain, 6);
     loadParameterFloatVector(nodeHandle, "estimatorMatrix", estimatorMatrix, 2);
 
-    loadParameterFloatVector(nodeHandle, "defaultSetpoint", setpoint, 4);
+    loadParameterFloatVector(nodeHandle, "defaultSetpoint", defaultSetpoint, 4);
 }
 
 float computeMotorPolyBackward(float thrust) {
@@ -159,7 +160,11 @@ void convertIntoBodyFrame(float est[9], float (&state)[9], float yaw_measured) {
     state[8] = est[8];
 }
 
-bool calculateControlOutput(Controller::Request &request, Controller::Response &response) {
+bool calculateControlOutput(Controller::Request &request, Controller::Response &response)
+{
+    ros::NodeHandle nodeHandle("~");
+    loadParameters(nodeHandle);
+
     CrazyflieData vicon = request.ownCrazyflie;
 	
 	float yaw_measured = request.ownCrazyflie.yaw;
@@ -249,7 +254,7 @@ bool calculateControlOutput(Controller::Request &request, Controller::Response &
     previousLocation = request.ownCrazyflie;
 
 	bag.write("ControlOutput", ros::Time::now(), response.controlOutput);
-    
+
 	return true;
 }
 
@@ -268,6 +273,7 @@ int main(int argc, char* argv[]) {
 
     ros::NodeHandle nodeHandle("~");
     loadParameters(nodeHandle);
+    setpoint = defaultSetpoint; // only first time setpoint is equal to default setpoint
 
     ros::Publisher setpointPublisher = nodeHandle.advertise<Setpoint>("Setpoint", 1);
     ros::Subscriber setpointSubscriber = nodeHandle.subscribe("Setpoint", 1, setpointCallback);
-- 
GitLab