|
@@ -0,0 +1,151 @@
|
|
|
+#include "vtd_pilot.h"
|
|
|
+
|
|
|
+
|
|
|
+static void CalcXY(const double lat0,const double lon0,
|
|
|
+ const double lat,const double lon,
|
|
|
+ double & x,double & y)
|
|
|
+{
|
|
|
+
|
|
|
+ double x0,y0;
|
|
|
+ GaussProjCal(lon0,lat0,&x0,&y0);
|
|
|
+ GaussProjCal(lon,lat,&x,&y);
|
|
|
+ x = x - x0;
|
|
|
+ y = y- y0;
|
|
|
+}
|
|
|
+
|
|
|
+vtd_pilot::vtd_pilot(std::string strfromvtd,std::string strtovtd)
|
|
|
+{
|
|
|
+ (void)strfromvtd;
|
|
|
+// mpfromvtd = iv::modulecomm::RegisterRecv(strfromvtd.data(),);
|
|
|
+ mptovtd = iv::modulecomm::RegisterSend(strtovtd.data(),10000,0);
|
|
|
+
|
|
|
+ ModuleFun fungpsimu =std::bind(&vtd_pilot::UpdateGPSIMU,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3,std::placeholders::_4,std::placeholders::_5);
|
|
|
+ mpagpsimu = iv::modulecomm::RegisterRecvPlus("hcp2_gpsimu",fungpsimu);
|
|
|
+
|
|
|
+ mpaegostate = iv::modulecomm::RegisterSend("egostate",10000,1);
|
|
|
+
|
|
|
+ mpthread = new std::thread(&vtd_pilot::threadego,this);
|
|
|
+
|
|
|
+ memset( &sOwnObjectState, 0, sizeof( RDB_OBJECT_STATE_t ) );
|
|
|
+}
|
|
|
+
|
|
|
+void vtd_pilot::UpdateGPSIMU(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
|
|
|
+{
|
|
|
+
|
|
|
+ (void)index;
|
|
|
+ (void)dt;
|
|
|
+ (void)strmemname;
|
|
|
+ iv::gps::gpsimu xgpsimu;
|
|
|
+ if(!xgpsimu.ParseFromArray(strdata,nSize))
|
|
|
+ {
|
|
|
+ std::cout<<"parse gpsimu fail"<<std::endl;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ mmutex.lock();
|
|
|
+ mgpsimu.CopyFrom(xgpsimu);
|
|
|
+ mbupdate_gps = true;
|
|
|
+ mmutex.unlock();
|
|
|
+}
|
|
|
+
|
|
|
+void vtd_pilot::UpdateVTD(const char *strdata, const unsigned int nSize, const unsigned int index, const QDateTime *dt, const char *strmemname)
|
|
|
+{
|
|
|
+ (void)index;
|
|
|
+ (void)dt;
|
|
|
+ (void)strmemname;
|
|
|
+
|
|
|
+ iv::vtd::rdbdata xrdbdata;
|
|
|
+ if(xrdbdata.ParseFromArray(strdata,nSize))
|
|
|
+ {
|
|
|
+ if(xrdbdata.mrdbitem_size()>0)
|
|
|
+ {
|
|
|
+ iv::vtd::rdbitem * pitem = xrdbdata.mutable_mrdbitem(0);
|
|
|
+ msimFrame = pitem->simframe();
|
|
|
+ msimTime = pitem->simtime();
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void vtd_pilot::setOwnState(double x, double y, double z)
|
|
|
+{
|
|
|
+ sOwnObjectState.base.id = 1;
|
|
|
+ sOwnObjectState.base.category = RDB_OBJECT_CATEGORY_PLAYER;
|
|
|
+ sOwnObjectState.base.type = RDB_OBJECT_TYPE_PLAYER_CAR;
|
|
|
+ strcpy( sOwnObjectState.base.name, "Ego" );
|
|
|
+
|
|
|
+ // dimensions of own vehicle
|
|
|
+ sOwnObjectState.base.geo.dimX = 4.60 ;//* dimFactor;
|
|
|
+ sOwnObjectState.base.geo.dimY = 1.86 ;//* dimFactor;
|
|
|
+ sOwnObjectState.base.geo.dimZ = 1.60 ;//* dimFactor;
|
|
|
+
|
|
|
+
|
|
|
+ // offset between reference point and center of geometry
|
|
|
+ sOwnObjectState.base.geo.offX = 0.80;
|
|
|
+ sOwnObjectState.base.geo.offY = 0.00;
|
|
|
+ sOwnObjectState.base.geo.offZ = 0.30;
|
|
|
+
|
|
|
+ sOwnObjectState.base.pos.x = x;
|
|
|
+ sOwnObjectState.base.pos.y = y;
|
|
|
+ sOwnObjectState.base.pos.z = z;
|
|
|
+ sOwnObjectState.base.pos.h = 0.0;
|
|
|
+ sOwnObjectState.base.pos.p = 0.0;
|
|
|
+ sOwnObjectState.base.pos.r = 0.0;
|
|
|
+ sOwnObjectState.base.pos.flags = RDB_COORD_FLAG_POINT_VALID | RDB_COORD_FLAG_ANGLES_VALID;
|
|
|
+
|
|
|
+ sOwnObjectState.ext.speed.x = 0;
|
|
|
+ sOwnObjectState.ext.speed.y = 0;
|
|
|
+ sOwnObjectState.ext.speed.z = 0;
|
|
|
+ sOwnObjectState.ext.speed.h = 0.0;
|
|
|
+ sOwnObjectState.ext.speed.p = 0.0;
|
|
|
+ sOwnObjectState.ext.speed.r = 0.0;
|
|
|
+ sOwnObjectState.ext.speed.flags = RDB_COORD_FLAG_POINT_VALID | RDB_COORD_FLAG_ANGLES_VALID;
|
|
|
+
|
|
|
+ sOwnObjectState.ext.accel.x = 0.0;
|
|
|
+ sOwnObjectState.ext.accel.y = 0.0;
|
|
|
+ sOwnObjectState.ext.accel.z = 0.0;
|
|
|
+ sOwnObjectState.ext.accel.flags = RDB_COORD_FLAG_POINT_VALID;
|
|
|
+
|
|
|
+ sOwnObjectState.base.visMask = RDB_OBJECT_VIS_FLAG_TRAFFIC | RDB_OBJECT_VIS_FLAG_RECORDER;
|
|
|
+}
|
|
|
+
|
|
|
+void vtd_pilot::threadego()
|
|
|
+{
|
|
|
+ while(mbRun)
|
|
|
+ {
|
|
|
+ if(mbupdate_gps == false)
|
|
|
+ {
|
|
|
+ std::unique_lock<std::mutex> lk(mmutexcv);
|
|
|
+ if(mcv.wait_for(lk,std::chrono::milliseconds(100)) == std::cv_status::timeout)
|
|
|
+ {
|
|
|
+ lk.unlock();
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ lk.unlock();
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ iv::gps::gpsimu xgpsimu;
|
|
|
+ mmutex.lock();
|
|
|
+ xgpsimu.CopyFrom(mgpsimu);
|
|
|
+ mbupdate_gps = false;
|
|
|
+ mmutex.unlock();
|
|
|
+
|
|
|
+ double x,y,z;
|
|
|
+ CalcXY(xgpsimu.lat(),xgpsimu.lon(),mflat0,mflon0,x,y);
|
|
|
+ z = 0;
|
|
|
+ setOwnState(x,y,z);
|
|
|
+
|
|
|
+ RDB_OBJECT_STATE_t * pr = &sOwnObjectState;
|
|
|
+
|
|
|
+ iv::modulecomm::ModuleSendMsg(mpaegostate,(char *)&sOwnObjectState,sizeof(RDB_OBJECT_STATE_t));
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ //convert to x,y,z
|
|
|
+
|
|
|
+ //send data.
|
|
|
+ }
|
|
|
+}
|