|
@@ -3,9 +3,14 @@
|
|
|
#include <iostream>
|
|
|
#include "vtd.pb.h"
|
|
|
|
|
|
+#include "RDBHandler.hh"
|
|
|
+
|
|
|
+#include "tf/transform_datatypes.h"
|
|
|
+
|
|
|
#define DEFAULT_BUFFER 204800
|
|
|
|
|
|
vtd_autoware::vtd_autoware()
|
|
|
+: private_nh_("~")
|
|
|
{
|
|
|
|
|
|
}
|
|
@@ -15,6 +20,176 @@ vtd_autoware::~vtd_autoware()
|
|
|
|
|
|
}
|
|
|
|
|
|
+void vtd_autoware::createROSPubSub()
|
|
|
+{
|
|
|
+ pub_objects_ = nh_.advertise<autoware_msgs::DetectedObjectArray>("/detection/lidar_detector/objects", 1);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+void vtd_autoware::ConvertToObjectArray(std::vector<iv::vtd::rdbdata> & xvectorrdbdata,autoware_msgs::DetectedObjectArray & xobjectsarray)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+ int j;
|
|
|
+ std::cout<<" obj size: "<<xvectorrdbdata.size()<<std::endl;
|
|
|
+ for(i=0;i<(int)xvectorrdbdata.size();i++)
|
|
|
+ {
|
|
|
+ iv::vtd::rdbdata * prdbdata = &xvectorrdbdata[i];
|
|
|
+ for(j=0;j<prdbdata->mrdbitem_size();j++)
|
|
|
+ {
|
|
|
+ iv::vtd::rdbitem * pitem = prdbdata->mutable_mrdbitem(j);
|
|
|
+ if(pitem->pkgid() == RDB_PKG_ID_OBJECT_STATE)
|
|
|
+ {
|
|
|
+ RDB_OBJECT_STATE_t xobj;
|
|
|
+ // std::cout<<" structure RDB_OBJECT_STATE_t size: "<<sizeof(xobj)<<"data size: "<<xrdbitem.mnpkgdatasize<<std::endl;
|
|
|
+ memcpy(&xobj,pitem->pkgdata().data(),sizeof(RDB_OBJECT_STATE_t));
|
|
|
+ // std::cout<<"id:"<<xobj.base.id<<" name:"<<xobj.base.name<< " pos : x "<<xobj.base.pos.x<<" y "<<xobj.base.pos.y<<" z "<<xobj.base.pos.z<<std::endl;
|
|
|
+ if(xobj.base.id == 1)
|
|
|
+ {
|
|
|
+ mfX = xobj.base.pos.x;
|
|
|
+ mfY = xobj.base.pos.y;
|
|
|
+ mfHeading = xobj.base.pos.h;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ autoware_msgs::DetectedObject * pobject = NULL;
|
|
|
+
|
|
|
+ int k;
|
|
|
+ for(k=0;k<xobjectsarray.objects.size();k++)
|
|
|
+ {
|
|
|
+ if(xobjectsarray.objects[k].id== xobj.base.id)
|
|
|
+ {
|
|
|
+ pobject = &xobjectsarray.objects[k];
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(pobject == NULL)
|
|
|
+ {
|
|
|
+ autoware_msgs::DetectedObject xobject;
|
|
|
+ xobjectsarray.objects.push_back(xobject);
|
|
|
+ pobject = &xobjectsarray.objects[xobjectsarray.objects.size() -1];
|
|
|
+
|
|
|
+ }
|
|
|
+ pobject->id = xobj.base.id;
|
|
|
+ double x,y;
|
|
|
+ x = xobj.base.pos.x - mfX;
|
|
|
+ y = (xobj.base.pos.y - mfY)*(1.0);
|
|
|
+ double relx,rely;
|
|
|
+ double beta = mfHeading*(-1.0);
|
|
|
+ relx = x*cos(beta) - y*sin(beta);
|
|
|
+ rely = x*sin(beta) + y*cos(beta);
|
|
|
+ double vx,vy;
|
|
|
+ vx = xobj.ext.speed.x;
|
|
|
+ vy = xobj.ext.speed.y;
|
|
|
+ vx = vx - mfvx;
|
|
|
+ vy = vy - mfvy;
|
|
|
+ double relvx,relvy;
|
|
|
+ relvx = vx*cos(beta) - vy*sin(beta);
|
|
|
+ relvy = vx*sin(beta) + vy*sin(beta);
|
|
|
+ double fobjheading = xobj.base.pos.h;
|
|
|
+ fobjheading = fobjheading - mfHeading;
|
|
|
+ pobject->score = 1.0;
|
|
|
+ pobject->label = "car";
|
|
|
+
|
|
|
+
|
|
|
+ // object.header = in_header;
|
|
|
+ pobject->valid = true;
|
|
|
+ pobject->pose_reliable = true;
|
|
|
+
|
|
|
+ pobject->pose.position.x = x;
|
|
|
+ pobject->pose.position.y = y;
|
|
|
+ pobject->pose.position.z = xobj.base.pos.z;
|
|
|
+
|
|
|
+ // Trained this way
|
|
|
+ float yaw = fobjheading;//detections[i * OUTPUT_NUM_BOX_FEATURE_ + 6];
|
|
|
+ // yaw += M_PI/2;
|
|
|
+ // yaw = std::atan2(std::sin(yaw), std::cos(yaw));
|
|
|
+ geometry_msgs::Quaternion q = tf::createQuaternionMsgFromYaw(-yaw);
|
|
|
+ pobject->pose.orientation = q;
|
|
|
+
|
|
|
+
|
|
|
+ // Again: Trained this way
|
|
|
+ pobject->dimensions.x = xobj.base.geo.dimX;
|
|
|
+ pobject->dimensions.y = xobj.base.geo.dimY;
|
|
|
+ pobject->dimensions.z = xobj.base.geo.dimZ;
|
|
|
+
|
|
|
+ pobject->velocity.linear.x = sqrt(pow(relvx,2)+pow(relvy,2));
|
|
|
+
|
|
|
+
|
|
|
+// std::cout<<" x: "<<relx<<" y: "<<rely<<std::endl;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+void vtd_autoware::threadobject()
|
|
|
+{
|
|
|
+ std::vector<iv::vtd::rdbdata> xvectorrdbdata;
|
|
|
+
|
|
|
+ int nseq = 1;
|
|
|
+
|
|
|
+
|
|
|
+ int64_t nlastsharetime = std::chrono::system_clock::now().time_since_epoch().count();
|
|
|
+// int nmaxobjid = 2;
|
|
|
+ int nshareinter = 20; //100 ms share a data.
|
|
|
+ bool bshare = false;
|
|
|
+ while(mbRun)
|
|
|
+ {
|
|
|
+ int64_t now = std::chrono::system_clock::now().time_since_epoch().count();
|
|
|
+ int64_t timediff = abs(now-nlastsharetime)/1000000;
|
|
|
+ if(timediff >= nshareinter)
|
|
|
+ {
|
|
|
+ bshare = true;
|
|
|
+ }
|
|
|
+ if(bshare)
|
|
|
+ {
|
|
|
+ autoware_msgs::DetectedObjectArray objects;
|
|
|
+ // iv::fusion::fusionobjectarray xfusionarray;
|
|
|
+ // ConvertToObjectArray(xvectorrdbdata,xfusionarray);
|
|
|
+ ConvertToObjectArray(xvectorrdbdata,objects);
|
|
|
+
|
|
|
+ pub_objects_.publish(objects);
|
|
|
+
|
|
|
+ objects.header.frame_id = "vtd";
|
|
|
+ objects.header.seq = nseq;
|
|
|
+// objects.header.stamp = 1;
|
|
|
+
|
|
|
+ //share object data.
|
|
|
+ bshare = false;
|
|
|
+ nlastsharetime = now;
|
|
|
+ xvectorrdbdata.clear();
|
|
|
+ }
|
|
|
+ std::unique_lock<std::mutex> lk(mmutexcvrdb);
|
|
|
+ if(mcvrdb.wait_for(lk,std::chrono::milliseconds(10)) == std::cv_status::timeout)
|
|
|
+ {
|
|
|
+ lk.unlock();
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ lk.unlock();
|
|
|
+
|
|
|
+ }
|
|
|
+ mmutexrdb.lock();
|
|
|
+ int i;
|
|
|
+ for(i=0;i<(int)mvectorrdbdata.size();i++)
|
|
|
+ {
|
|
|
+ xvectorrdbdata.push_back(mvectorrdbdata[i]);
|
|
|
+ }
|
|
|
+ mvectorrdbdata.clear();
|
|
|
+ mmutexrdb.unlock();
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
void vtd_autoware::UpdateVTD(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
|
|
|
{
|
|
|
(void)index;
|
|
@@ -24,7 +199,10 @@ void vtd_autoware::UpdateVTD(const char * strdata,const unsigned int nSize,const
|
|
|
iv::vtd::rdbdata xrdbdata;
|
|
|
if(xrdbdata.ParseFromArray(strdata,nSize))
|
|
|
{
|
|
|
-
|
|
|
+ mmutexrdb.lock();
|
|
|
+ mvectorrdbdata.push_back(xrdbdata);
|
|
|
+ mmutexrdb.unlock();
|
|
|
+ mcvrdb.notify_all();
|
|
|
}
|
|
|
}
|
|
|
|