#if 1 #include #include #include #include #include "xmlparam.h" #include "modulecomm.h" #include "ivbacktrace.h" #include "ivversion.h" #include "decition.pb.h" #include "chassis.pb.h" #include "remotectrl.pb.h" #include "gpsimu.pb.h" #include #include #include #include "include/car_control.h" enum class AppCtrlSm //cxw,20220622 { kStandby = 0, kStartup = 1, kActive = 2, kShutDown = 3 }; CarControl car_control_module; AppCtrlSm app_ctrl_car_sm_ = AppCtrlSm::kStandby; using namespace std; void * gpadecition; iv::brain::decition gdecition_def; iv::brain::decition gdecition; int gnDecitionNum = 0; //when is zero,send default; const int gnDecitionNumMax = 100; static QMutex gMutex; bool gstatus; GearPrkgAssistReq ggearSetVal; GearLevelIndicate ggearRealVal; ChassisErrCode gchassErr; StsMach gstsMach; float gsteerDeg, gspeed; double lastspeedSetVal = 0; double lastEpsSetVal = 0; GearPrkgAssistReq lastgearSetVal= GearPrkgAssistReq::kNoRequest; const int gCommunctionNum = 10; int communicate_cnt=0; //判断decition中是否有决策,超过设定的数值以后认为没有决策退出控制车辆 bool communicate_state=0; int case_state=0;//记录switch case的状态,调试用 static bool gbAutoDriving = true; static iv::brain::decition gdecition_remote; static qint64 gLastRemoteTime = 0; static qint64 gLastGPSIMUTime = 0; static double gfVehSpeed = 0; // km/h const double gfMaxRemoteVehSpeed = 10; //Max Speed in Remote Mode void quit_ctrl() //退出车辆控制,cxw,20220622 { car_control_module.set_lat_lgt_ctrl_req(false);//握手请求, true:请求握手, false:退出握手 car_control_module.set_target_gear( GearPrkgAssistReq::kNoRequest);// 目标档位请求 car_control_module.set_target_pinion_ag_in_deg(car_control_module.get_current_steer_ang_in_deg());//设置目标方向盘角度请求, -450°至+450°(车辆实测范围值),方向盘左正,右负 car_control_module.set_target_acc_mps2(0);//// 目标加减速度值 car_control_module.set_turn_light_status(TurnLightIndicReq::kOff);// 转向灯控制请求 } static void ShareChassis(void * pa,iv::chassis * pchassis) { char * str; int ndatasize = pchassis->ByteSize(); str = new char[ndatasize]; std::shared_ptr pstr; pstr.reset(str); if(!pchassis->SerializeToArray(str,ndatasize)) { std::cout<<"ShareChassis Error."<0) EpsSetVal=Steer_current_value+90; else EpsSetVal=Steer_current_value-90; } car_control_module.set_target_gear(gearSetVal); car_control_module.set_target_acc_mps2(speedSetVal); car_control_module.set_target_pinion_ag_in_deg(EpsSetVal); if(decition.has_leftlamp() && decition.leftlamp()==true) car_control_module.set_turn_light_status(TurnLightIndicReq::kLeft); else if(decition.has_rightlamp() && decition.rightlamp()==true) car_control_module.set_turn_light_status(TurnLightIndicReq::kRight); else car_control_module.set_turn_light_status(TurnLightIndicReq::kOff); /* void set_lat_lgt_ctrl_req(bool req); // 握手请求, true:请求握手, false:退出握手 void set_target_gear(GearPrkgAssistReq tar); // 目标档位请求 bool is_lat_lgt_ctrl_active(); // 底盘控制状态反馈, true: 底盘可线控, false: 底盘不可控 void set_target_pinion_ag_in_deg(float32_t ang_req);// 设置目标方向盘角度请求, -450°至+450°(车辆实测范围值),方向盘左正,右负。 void set_target_acc_mps2(float32_t tar_acc);// 目标加减速度值。 void set_turn_light_status(TurnLightIndicReq req);// 转向灯控制请求 */ } void Listengpsimu(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname) { // ggpsimu->UpdateGPSIMU(strdata,nSize); iv::gps::gpsimu xgpsimu; if(!xgpsimu.ParseFromArray(strdata,nSize)) { std::cout<<"ListenRaw Parse error."<=(gfMaxRemoteVehSpeed*1.1)) { xdecition.set_accelerator(0.0); } else { if(gfVehSpeed>gfMaxRemoteVehSpeed) { xdecition.set_accelerator(xrc.acc()*0.01*(gfMaxRemoteVehSpeed*1.1-gfVehSpeed)/(gfMaxRemoteVehSpeed*0.1)); } else { if(abs(QDateTime::currentMSecsSinceEpoch() - gLastGPSIMUTime)<3000) { xdecition.set_accelerator(xrc.acc()*0.01); } else { xdecition.set_accelerator(0.0); } } } // xdecition.set_accelerator(xrc.acc()*0.01); if(xrc.brake()>0.01) { xdecition.set_accelerator(xrc.brake()*(-0.03)); } // xdecition.set_brake(0); //not use brake xdecition.set_wheelangle(xrc.wheel() *5.5); xdecition.set_gear(3); gMutex.lock(); gdecition_remote.CopyFrom(xdecition); gMutex.unlock(); gLastRemoteTime = QDateTime::currentMSecsSinceEpoch(); } // if((oldtime - QDateTime::currentMSecsSinceEpoch())<-100)qDebug("dection time is %ld diff is %ld ",QDateTime::currentMSecsSinceEpoch(),oldtime - QDateTime::currentMSecsSinceEpoch()); // oldtime = QDateTime::currentMSecsSinceEpoch(); // gMutex.lock(); // gdecition.CopyFrom(xdecition); // gMutex.unlock(); // gnDecitionNum = gnDecitionNumMax; // gbChassisEPS = false; } void ListenDeciton(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname) { qint64 oldtime; iv::brain::decition xdecition; if(!xdecition.ParseFromArray(strdata,nSize)) { std::cout<<"ListenDecition parse error."< 21) // qDebug("%d",t); // time.restart(); if(gnDecitionNum <= 0) { // gdecition_def.set_wheelangle(car_control_module.get_current_steer_ang_in_deg()); // xdecition.CopyFrom(gdecition_def); // std::cout<<"copy from gdecition_def@@@@@@@@@@@@"< 3000) { gbAutoDriving = true; } } else { gMutex.lock(); xdecition.CopyFrom(gdecition); // std::cout<<"copy from ADAS gdecition"<gCommunctionNum) { communicate_state=0; //说明decition无决策 communicate_cnt=gCommunctionNum+1; } #if 1 switch (app_ctrl_car_sm_) { case AppCtrlSm::kStandby://ctrl_car节点有消息输入,否则退出与汽车的控制 if (communicate_state!=0) { app_ctrl_car_sm_ = AppCtrlSm::kStartup; case_state=0; } else { quit_ctrl(); std::cout<<" no decition "< #include #include #include #include "xmlparam.h" #include "modulecomm.h" #include "ivbacktrace.h" #include "ivversion.h" #include "decition.pb.h" #include "chassis.pb.h" #include #include "include/car_control.h" CarControl car_control_module; void * gpadecition; iv::brain::decition gdecition_def; iv::brain::decition gdecition; int gnDecitionNum = 0; //when is zero,send default; const int gnDecitionNumMax = 100; static QMutex gMutex; bool gstatus; GearPrkgAssistReq ggearSetVal; GearLevelIndicate ggearRealVal; ChassisErrCode gchassErr; StsMach gstsMach; float gsteerDeg, gspeed; double lastspeedSetVal = 0; double lastEpsSetVal = 0; GearPrkgAssistReq lastgearSetVal= GearPrkgAssistReq::kNoRequest; static void ShareChassis(void * pa,iv::chassis * pchassis) { char * str; int ndatasize = pchassis->ByteSize(); str = new char[ndatasize]; std::shared_ptr pstr; pstr.reset(str); if(!pchassis->SerializeToArray(str,ndatasize)) { std::cout<<"ShareChassis Error."<