|
@@ -0,0 +1,242 @@
|
|
|
+#include "groupspeedctrl.h"
|
|
|
+
|
|
|
+#include "common/car_status.h"
|
|
|
+#include "adc_tools/transfer.h"
|
|
|
+
|
|
|
+#include "gnss_coordinate_convert.h"
|
|
|
+
|
|
|
+GroupSpeedCtrl::GroupSpeedCtrl()
|
|
|
+{
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+double GroupSpeedCtrl::Getmindec(iv::group::groupinfo & xgroupinfo,
|
|
|
+ const std::vector<GPSData> & gpsMapLine,int PathPoint)
|
|
|
+{
|
|
|
+
|
|
|
+ iv::group::vehicleinfo * pvehaffter = NULL; //a vehicle after current vehicle
|
|
|
+ int i;
|
|
|
+ for(i=0;i<xgroupinfo.mvehinfo_size();i++)
|
|
|
+ {
|
|
|
+ if(xgroupinfo.mutable_mvehinfo(i)->intragroupid() == (ServiceCarStatus.curID+1))
|
|
|
+ {
|
|
|
+ pvehaffter = xgroupinfo.mutable_mvehinfo(i);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(pvehaffter == NULL)
|
|
|
+ {
|
|
|
+ return 0.0;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(gpsMapLine.size()<1)
|
|
|
+ {
|
|
|
+ return 0.0;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(!pvehaffter->has_mgpsimu())
|
|
|
+ {
|
|
|
+ return 0.0;
|
|
|
+ }
|
|
|
+
|
|
|
+ double x,y;
|
|
|
+ GaussProjCal(pvehaffter->mgpsimu().lon(),pvehaffter->mgpsimu().lat(),&x,&y);
|
|
|
+
|
|
|
+ int nearpoint = -1;
|
|
|
+ double neardis = 100000;
|
|
|
+
|
|
|
+ double nearthresh = 100;
|
|
|
+ int nsize = gpsMapLine.size();
|
|
|
+ for(i=0;i<nsize;i++)
|
|
|
+ {
|
|
|
+ if((fabs(x - gpsMapLine[i]->gps_x)<nearthresh) || (fabs(y - gpsMapLine[i]->gps_y)<nearthresh))
|
|
|
+ {
|
|
|
+ double fdis = sqrt(pow(x - gpsMapLine[i]->gps_x,2)+pow(y - gpsMapLine[i]->gps_y,2));
|
|
|
+ double fanglediff = pvehaffter->mgpsimu().heading() - gpsMapLine[i]->ins_heading_angle;
|
|
|
+ while(fanglediff<-180)fanglediff = fanglediff + 360.0;
|
|
|
+ while(fanglediff>180)fanglediff = fanglediff - 360.0;
|
|
|
+ if((fdis<nearthresh) &&(fabs(fanglediff)<90))
|
|
|
+ {
|
|
|
+ if(fdis<neardis)
|
|
|
+ {
|
|
|
+ neardis = fdis;
|
|
|
+ nearpoint = i;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(nearpoint <0)
|
|
|
+ {
|
|
|
+ return 0.0;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ double fdistocur = 0; //after vehicle to now vehicle
|
|
|
+
|
|
|
+ if(PathPoint< nearpoint) // now after the after vehicle
|
|
|
+ {
|
|
|
+ return 0.0;
|
|
|
+ }
|
|
|
+
|
|
|
+ for(i=(nearpoint+1);i<PathPoint;i++)
|
|
|
+ {
|
|
|
+ double fdistolast = iv::decition::GetDistance(*gpsMapLine[i],*gpsMapLine[i-1]);
|
|
|
+ fdistocur = fdistocur + fdistolast;
|
|
|
+ }
|
|
|
+
|
|
|
+ double decmax = mfDecMax;
|
|
|
+ double dis_startdec = mfDis_StartDec_Next; //if > 50 start wait
|
|
|
+ double dis_maxdec = mfDis_MaxDec_Next; //if > 60 max dec
|
|
|
+
|
|
|
+ if(fdistocur>=dis_maxdec)return decmax;
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(fdistocur<=dis_startdec)return 0.0;
|
|
|
+ else
|
|
|
+ {
|
|
|
+ assert(dis_maxdec > dis_startdec);
|
|
|
+ double fratio = (fdistocur - dis_startdec)/(dis_maxdec - dis_startdec);
|
|
|
+ double fdec = fratio * decmax;
|
|
|
+ return fdec;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0.0;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+double GroupSpeedCtrl::Getmindec_front(iv::group::groupinfo & xgroupinfo,
|
|
|
+ const std::vector<GPSData> & gpsMapLine,int PathPoint)
|
|
|
+{
|
|
|
+
|
|
|
+ iv::group::vehicleinfo * pvehbefore = NULL; //a vehicle after current vehicle
|
|
|
+ int i;
|
|
|
+ for(i=0;i<xgroupinfo.mvehinfo_size();i++)
|
|
|
+ {
|
|
|
+ if((xgroupinfo.mutable_mvehinfo(i)->intragroupid()+1) == ServiceCarStatus.curID)
|
|
|
+ {
|
|
|
+ pvehbefore = xgroupinfo.mutable_mvehinfo(i);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(pvehbefore == NULL)
|
|
|
+ {
|
|
|
+ return 0.0;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(gpsMapLine.size()<1)
|
|
|
+ {
|
|
|
+ return 0.0;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(!pvehbefore->has_mgpsimu())
|
|
|
+ {
|
|
|
+ return 0.0;
|
|
|
+ }
|
|
|
+
|
|
|
+ double x,y;
|
|
|
+ GaussProjCal(pvehbefore->mgpsimu().lon(),pvehbefore->mgpsimu().lat(),&x,&y);
|
|
|
+
|
|
|
+ int nearpoint = -1;
|
|
|
+ double neardis = 100000;
|
|
|
+
|
|
|
+ double nearthresh = 100;
|
|
|
+ int nsize = gpsMapLine.size();
|
|
|
+ for(i=0;i<nsize;i++)
|
|
|
+ {
|
|
|
+ if((fabs(x - gpsMapLine[i]->gps_x)<nearthresh) || (fabs(y - gpsMapLine[i]->gps_y)<nearthresh))
|
|
|
+ {
|
|
|
+ double fdis = sqrt(pow(x - gpsMapLine[i]->gps_x,2)+pow(y - gpsMapLine[i]->gps_y,2));
|
|
|
+ double fanglediff = pvehbefore->mgpsimu().heading() - gpsMapLine[i]->ins_heading_angle;
|
|
|
+ while(fanglediff<-180)fanglediff = fanglediff + 360.0;
|
|
|
+ while(fanglediff>180)fanglediff = fanglediff - 360.0;
|
|
|
+ if((fdis<nearthresh) &&(fabs(fanglediff)<90))
|
|
|
+ {
|
|
|
+ if(fdis<neardis)
|
|
|
+ {
|
|
|
+ neardis = fdis;
|
|
|
+ nearpoint = i;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(nearpoint <0)
|
|
|
+ {
|
|
|
+ return 0.0;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ double fdistocur = 0; //after vehicle to now vehicle
|
|
|
+
|
|
|
+ if(PathPoint > nearpoint) // now after the after vehicle
|
|
|
+ {
|
|
|
+ return 0.0;
|
|
|
+ }
|
|
|
+
|
|
|
+ for(i=(PathPoint+1);i<nearpoint;i++)
|
|
|
+ {
|
|
|
+ double fdistolast = iv::decition::GetDistance(*gpsMapLine[i],*gpsMapLine[i-1]);
|
|
|
+ fdistocur = fdistocur + fdistolast;
|
|
|
+ }
|
|
|
+
|
|
|
+ double decmax = mfDecMax;
|
|
|
+ double dis_startdec = mfDis_StartDec_Front; //if > 50 start wait
|
|
|
+ double dis_maxdec = mfDis_MaxDec_Front; //if > 60 max dec
|
|
|
+
|
|
|
+ if(fdistocur>=dis_startdec)return 0.0;
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(fdistocur<=dis_maxdec)return decmax;
|
|
|
+ else
|
|
|
+ {
|
|
|
+ assert(dis_maxdec < dis_startdec);
|
|
|
+ double fratio = ( dis_startdec - fdistocur)/(dis_startdec -dis_maxdec );
|
|
|
+ double fdec = fratio * decmax;
|
|
|
+ return fdec;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0.0;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+void GroupSpeedCtrl::SetDecMax(double fDecMax)
|
|
|
+{
|
|
|
+ mfDecMax = fDecMax;
|
|
|
+}
|
|
|
+
|
|
|
+void GroupSpeedCtrl::SetDisStartDec_Next(double fDis_StartDec)
|
|
|
+{
|
|
|
+ mfDis_StartDec_Next = fDis_StartDec;
|
|
|
+}
|
|
|
+
|
|
|
+void GroupSpeedCtrl::SetDisMaxDec_Next(double fDis_MaxDec)
|
|
|
+{
|
|
|
+ mfDis_MaxDec_Next = fDis_MaxDec;
|
|
|
+}
|
|
|
+
|
|
|
+void GroupSpeedCtrl::SetDisStartDec_Front(double fDis_StartDec)
|
|
|
+{
|
|
|
+ mfDis_StartDec_Front = fDis_StartDec;
|
|
|
+}
|
|
|
+
|
|
|
+void GroupSpeedCtrl::SetDisMaxDec_Front(double fDis_MaxDec)
|
|
|
+{
|
|
|
+ mfDis_MaxDec_Front = fDis_MaxDec;
|
|
|
+}
|