#include "fsm_unit.h" #include #include #include "gpsimu.pb.h" #include "math/gnss_coordinate_convert.h" extern char stryamlpath[256]; FSMUnit::FSMUnit(void) { dec_yaml(stryamlpath); shmFSMSkipCMD.mpa = iv::modulecomm::RegisterSend(shmFSMSkipCMD.mstrmsgname,shmFSMSkipCMD.mnBufferSize,shmFSMSkipCMD.mnBufferCount); shmXodrRequest.mpa = iv::modulecomm::RegisterSend(shmXodrRequest.mstrmsgname,shmXodrRequest.mnBufferSize,shmXodrRequest.mnBufferCount); ModuleFun funupdate = std::bind(&FSMUnit::ListenBrainStateMsg,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3,std::placeholders::_4,std::placeholders::_5); shmBrainState.mpa = iv::modulecomm::RegisterRecvPlus(shmBrainState.mstrmsgname,funupdate); funupdate = std::bind(&FSMUnit::ListenGPSIMUMsg,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3,std::placeholders::_4,std::placeholders::_5); shmGPSIMU.mpa = iv::modulecomm::RegisterRecvPlus(shmGPSIMU.mstrmsgname,funupdate); QObject::connect(this,&FSMUnit::refreshFSMStatus,this,&FSMUnit::refreshFSMStatus_Slot); QObject::connect(&skipCMDSendTimer,&QTimer::timeout,this,&FSMUnit::skipCMDSend_Timeout); QObject::connect(&arriveCheckLoopTimer,&QTimer::timeout,this,&FSMUnit::arriveCheckLoop_Timeout); QObject::connect(this,&FSMUnit::sendPathPlanRequest,this,&FSMUnit::sendPathPlanRequest_Slot); if(skipCMDSendTimer.isActive() == false)skipCMDSendTimer.start(skipCMDSendInterval); if(arriveCheckLoopTimer.isActive() == false)arriveCheckLoopTimer.start(100); } FSMUnit::~FSMUnit(void) { if(shmFSMSkipCMD.mpa != nullptr)iv::modulecomm::Unregister(shmFSMSkipCMD.mpa); if(shmXodrRequest.mpa != nullptr)iv::modulecomm::Unregister(shmXodrRequest.mpa); if(shmBrainState.mpa != nullptr)iv::modulecomm::Unregister(shmBrainState.mpa); if(shmGPSIMU.mpa != nullptr)iv::modulecomm::Unregister(shmGPSIMU.mpa); } void FSMUnit::dec_yaml(const char *stryamlpath) { YAML::Node config; try { config = YAML::LoadFile(stryamlpath); } catch(YAML::BadFile &e) { std::cout<(); strncpy(shmGPSIMU.mstrmsgname,strmsgname.data(),255); shmGPSIMU.mnBufferSize = config["GPS_IMU"]["buffersize"].as(); shmGPSIMU.mnBufferCount = config["GPS_IMU"]["buffercount"].as(); std::cout << "GPS_IMU:" << shmGPSIMU.mstrmsgname << "," << shmGPSIMU.mnBufferSize << "," << shmGPSIMU.mnBufferCount << std::endl; } } else { strmsgname = "hcp2_gpsimu"; strncpy(shmGPSIMU.mstrmsgname,strmsgname.data(),255); shmGPSIMU.mnBufferSize = 10000; shmGPSIMU.mnBufferCount = 1; } if(config["brain_state"]) { if(config["brain_state"]["msgname"]&&config["brain_state"]["buffersize"]&&config["brain_state"]["buffercount"]) { strmsgname = config["brain_state"]["msgname"].as(); strncpy(shmBrainState.mstrmsgname,strmsgname.data(),255); shmBrainState.mnBufferSize = config["brain_state"]["buffersize"].as(); shmBrainState.mnBufferCount = config["brain_state"]["buffercount"].as(); std::cout << "brain_state:" << shmBrainState.mstrmsgname << "," << shmBrainState.mnBufferSize << "," << shmBrainState.mnBufferCount << std::endl; } } else { strmsgname = "brainstate"; strncpy(shmBrainState.mstrmsgname,strmsgname.data(),255); shmBrainState.mnBufferSize = 10000; shmBrainState.mnBufferCount = 1; } if(config["FSM_skip_command"]) { if(config["FSM_skip_command"]["msgname"]&&config["FSM_skip_command"]["buffersize"]&&config["FSM_skip_command"]["buffercount"]) { strmsgname = config["FSM_skip_command"]["msgname"].as(); strncpy(shmFSMSkipCMD.mstrmsgname,strmsgname.data(),255); shmFSMSkipCMD.mnBufferSize = config["FSM_skip_command"]["buffersize"].as(); shmFSMSkipCMD.mnBufferCount = config["FSM_skip_command"]["buffercount"].as(); std::cout << "FSM_skip_command:" << shmFSMSkipCMD.mstrmsgname << "," << shmFSMSkipCMD.mnBufferSize << "," << shmFSMSkipCMD.mnBufferCount << std::endl; } } else { strmsgname = "FSMSkipCommand"; strncpy(shmFSMSkipCMD.mstrmsgname,strmsgname.data(),255); shmFSMSkipCMD.mnBufferSize = 10000; shmFSMSkipCMD.mnBufferCount = 1; } if(config["xodr_request"]) { if(config["xodr_request"]["msgname"]&&config["xodr_request"]["buffersize"]&&config["xodr_request"]["buffercount"]) { strmsgname = config["xodr_request"]["msgname"].as(); strncpy(shmXodrRequest.mstrmsgname,strmsgname.data(),255); shmXodrRequest.mnBufferSize = config["xodr_request"]["buffersize"].as(); shmXodrRequest.mnBufferCount = config["xodr_request"]["buffercount"].as(); std::cout << "xodr_request:" << shmXodrRequest.mstrmsgname << "," << shmXodrRequest.mnBufferSize << "," << shmXodrRequest.mnBufferCount << std::endl; } } else { strmsgname = "xodrreq"; strncpy(shmXodrRequest.mstrmsgname,strmsgname.data(),255); shmXodrRequest.mnBufferSize = 1000; shmXodrRequest.mnBufferCount = 1; } if(config["FSMSkipCMDinterval"]) { skipCMDSendInterval = config["FSMSkipCMDinterval"].as(); std::cout<<"FSMSkipCMDinterval:"<(); waitingStation.longitude = config["waitingStation"]["longitude"].as(); } } if(config["maintainStation"]) { if(config["maintainStation"]["latitude"]&&config["maintainStation"]["longitude"]) { maintainStation.latitude = config["maintainStation"]["latitude"].as(); maintainStation.longitude = config["maintainStation"]["longitude"].as(); } } return; } void FSMUnit::ListenGPSIMUMsg(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname) // need a lock { iv::gps::gpsimu xdata; if(!xdata.ParseFromArray(strdata,nSize)) { std::cout<<" ListenGPSIMUMsg parese error."< pstr;pstr.reset(str); if(!xmsg.SerializeToArray(str,ndatasize)) { std::cout<<"FSMSkipCommand serialize error."< 5.0) { emit sendPathPlanRequest(waitingStation.latitude,waitingStation.longitude); } GaussProjCal(currentPosition.longitude,currentPosition.latitude,&localPositionX,&localPositionY); GaussProjCal(currentDestination.longitude,currentDestination.latitude,&localPositionNextX,&localPositionNextY); deltaX = localPositionNextX - localPositionX; deltaY = localPositionNextY - localPositionY; distance = sqrt(deltaX*deltaX + deltaY*deltaY); if(distance < 5.0 && currentSpeed < 0.1) { waitingStationArrived = true; } } if(FSMState == 5) ///< 5返库 { double localPositionX = 0.0; double localPositionNextX = 0.0; double localPositionY = 0.0; double localPositionNextY = 0.0; GaussProjCal(maintainStation.longitude,maintainStation.latitude,&localPositionX,&localPositionY); GaussProjCal(currentDestination.longitude,currentDestination.latitude,&localPositionNextX,&localPositionNextY); double deltaX = localPositionNextX - localPositionX; double deltaY = localPositionNextY - localPositionY; double distance = sqrt(deltaX*deltaX + deltaY*deltaY); if(distance > 5.0) { emit sendPathPlanRequest(maintainStation.latitude,maintainStation.longitude); } GaussProjCal(currentPosition.longitude,currentPosition.latitude,&localPositionX,&localPositionY); GaussProjCal(currentDestination.longitude,currentDestination.latitude,&localPositionNextX,&localPositionNextY); deltaX = localPositionNextX - localPositionX; deltaY = localPositionNextY - localPositionY; distance = sqrt(deltaX*deltaX + deltaY*deltaY); if(distance < 5.0 && currentSpeed < 0.1) { maintainStationArrived = true; } } } void FSMUnit::sendPathPlanRequest_Slot(double latitude,double longitude) { xodrobj xodrDest; xodrDest.flon = longitude; xodrDest.flat = latitude; xodrDest.lane = 1; std::cout<<"current destination: "<