/* * @Author: zjk 1553836110@qq.com * @Date: 2023-10-12 09:52:27 * @LastEditors: zjk 1553836110@qq.com * @LastEditTime: 2023-11-07 12:01:57 * @FilePath: /moos-ivp-pi/src/pMotionControler/MotionControler.cpp * @Description: * * Copyright (c) 2023 by ${git_name_email}, All Rights Reserved. */ // #define DEBUG #include"MotionControler.hpp" //TODO:增加启用哪个控制器功能 bool MotionControler::OnNewMail(MOOSMSG_LIST &NewMail) { AppCastingMOOSApp::OnNewMail(NewMail); MOOSMSG_LIST::iterator p; for(p=NewMail.begin(); p!=NewMail.end(); p++) { CMOOSMsg &msg = *p; string key = msg.m_sKey; string sval = msg.m_sVal; double dval = msg.m_dfVal; double dfT; msg.IsSkewed(m_curr_time, &dfT); if(fabs(dfT) < ok_skew) { if((key == "MOOS_MANUAL_OVERIDE") || (key == "MOOS_MANUAL_OVERRIDE")) pengine.overrived(sval); else if(key == "DESIRED_HEADING") pengine.setDesHeading(dval, MOOSTime()); else if(key == "DESIRED_SPEED") pengine.setDesSpeed(dval, MOOSTime()); else if(key == "DESIRED_DEPTH") pengine.setDesDepth(dval, MOOSTime()); else if(key == "NAV_HEADING") pengine.setCurHeading(angle360(dval), MOOSTime()); else if(key == "NAV_SPEED") pengine.setCurSpeed(dval, MOOSTime()); else if(key == "NAV_DEPTH") pengine.setCurDepth(dval, MOOSTime()); else if(key == "NAV_PITCH") pengine.setCurPitch(dval, MOOSTime()); else if(key == MSG_ReadConfig) //重新读取配置参数可以清除故障码 { int e = pengine.setParam(configFilePath); pengine.setOverride(true); if(e != 0) faultCode = 10 + e; else faultCode = 0; } } } return true; } bool MotionControler::Iterate() { bool a; AppCastingMOOSApp::Iterate(); pengine.updateTime(m_curr_time); int i = pengine.step(); switch (i) { case 0: RepList["State : "] = "Run"; break; case 1: RepList["State : "] = "Ready"; break; case -1: RepList["State : "] = "Fault"; faultCode = 1;//信息超时 break; default: break; } postPengineResults(); postPenginePostings(); postCharStatus(); Notify(MSG_FALUT,faultCode); AppCastingMOOSApp::PostReport(); return true; } bool MotionControler::OnConnectToServer() { registerVariables(); return true; } bool MotionControler::OnStartUp() { AppCastingMOOSApp::OnStartUp(); pengine.setStartTime(MOOSTime()); STRING_LIST sParams; m_MissionReader.GetConfiguration(GetAppName(), sParams); //pengine.setConfigParams(sParams); //bool handled = true; STRING_LIST::iterator p; for(p=sParams.begin(); p!=sParams.end(); p++) { string orig = *p; string line = (orig); //识别大小写 string param = biteStringX(line, '='); string value = line; double dval = atof(value.c_str()); if(param == "config_file") configFilePath = value; else if(param == "tardy_helm_thresh") pengine.setTardyHelm(dval); else if(param == "tardy_nav_thresh") pengine.setTardyNav(dval); else if(param == "cheak_stalensee") pengine.setCheakStalensee(value); else if(param == "AppTick") setFrequency = dval; else if(param == "delta_freqency") frequency_delta = dval; else reportUnhandledConfigWarning(orig); } int e = pengine.setParam(configFilePath); if(e != 0) { faultCode = 10 + e; return false; } return true; } void MotionControler::registerVariables() { AppCastingMOOSApp::RegisterVariables(); Register("NAV_HEADING", 0); Register("NAV_SPEED", 0); Register("NAV_DEPTH", 0); Register("NAV_PITCH", 0); Register("DESIRED_HEADING", 0); Register("DESIRED_SPEED", 0); Register("DESIRED_DEPTH", 0); Register("PID_VERBOSE", 0); Register("SPEED_FACTOR", 0); Register("MOOS_MANUAL_OVERIDE", 0); Register("MOOS_MANUAL_OVERRIDE", 0); Register(MSG_ReadConfig,0); } bool MotionControler::buildReport() { double frequency = pengine.getFrequency(); double delta_freq = 100.0*(setFrequency - frequency) / setFrequency; if(abs(delta_freq) > frequency_delta) faultCode = 2; m_msgs << "Frequency Delta : " << frequency << endl; m_msgs << "PID has_control : " << boolToString(pengine.hasControl()) << endl; m_msgs << "Config File Path : " << configFilePath << endl; m_msgs << "S : H : D : | " << intToString(pengine.hasSpdCtrl())+ " | " << intToString(pengine.hasHdgCtrl())+" | " << intToString(pengine.hasDphCtrl())+" |" << endl; RepList["to BS"] = colVar; RepList["PID"] = pengine.getReport()["W"]; string rep = Json::writeString(RepJsBuilder, RepList); m_msgs << rep << endl; return(true); } void MotionControler::postPenginePostings() { vector m_postings = pengine.getPostings(); for(unsigned int i=0; i