fusion.hpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. #ifndef FUSION_HPP
  2. #define FUSION_HPP
  3. #include "fusion_probabilities.h"
  4. #include "fusionobjectarray.pb.h"
  5. #include <iostream>
  6. #include "opencv2/opencv.hpp"
  7. #include "perceptionoutput.h"
  8. #include "Eigen/Eigen"
  9. namespace iv {
  10. namespace fusion {
  11. //std::vector<Match_index> match_idxs;
  12. static float time_step = 0.3;
  13. static std::vector<std::string> labels = {"unknown","ped","bike","car","bus_or_truck"};
  14. typedef std::vector<iv::Perception::PerceptionOutput> LidarObject;
  15. float ComputeDis(cv::Point2f po1, cv::Point2f po2)
  16. {
  17. return (sqrt(pow((po1.x-po2.x),2) + pow((po1.y-po2.y),2)));
  18. }
  19. void Get_AssociationMat(LidarObject& lidar_object_vector,iv::radar::radarobjectarray& radar_object_array,
  20. std::vector<match_index>& match_idx,std::vector<int>&radar_idx)
  21. {
  22. // std::cout<<" is ok "<<std::endl;
  23. int nlidar = lidar_object_vector.size();
  24. int nradar = radar_object_array.obj_size();
  25. match_idx.clear();
  26. radar_idx.clear();
  27. for(int i = 0; i<lidar_object_vector.size(); i++)
  28. {
  29. match_index match;
  30. match.nlidar = i;
  31. std::vector<int> fuindex;
  32. // std::cout<<" size "<<radar_object_array.obj_size()<<std::endl;
  33. for(int j =0; j<radar_object_array.obj_size(); j++)
  34. {
  35. // std::cout<<" is ok "<<std::endl;
  36. if(radar_object_array.obj(j).bvalid() == false) continue;
  37. if(!(iv::fusion::FusionProbabilities::ComputRadarLidarmatch(radar_object_array.obj(j),lidar_object_vector.at(i))))
  38. {
  39. fuindex.push_back(j);
  40. }
  41. }
  42. if(fuindex.size() >0)
  43. {
  44. std::vector<float> dis;
  45. cv::Point2f po1;
  46. po1.x = lidar_object_vector.at(i).location.x;
  47. po1.y = lidar_object_vector.at(i).location.y;
  48. for(std::vector<int>::iterator d = fuindex.begin(); d !=fuindex.end(); d++)
  49. {
  50. cv::Point2f po2;
  51. po2.x = radar_object_array.obj(*d).x();
  52. po2.y = radar_object_array.obj(*d).y();
  53. dis.push_back(ComputeDis(po1,po2));
  54. }
  55. auto smallest = std::min_element(std::begin(dis), std::end(dis));
  56. int index = std::distance(std::begin(dis), smallest);
  57. dis.clear();
  58. match.nradar = index;
  59. }else {
  60. match.nradar = -1000;
  61. }
  62. // std::cout<<" fuindex nradar "<<fuindex.size()<<" "<<match.nradar<<std::endl;
  63. match_idx.push_back(match);
  64. }
  65. for(int k = 0; k<radar_object_array.obj_size(); k++)
  66. {
  67. std::vector<int> index;
  68. for(std::vector<match_index>::iterator l = match_idx.begin(); l != match_idx.end(); l++)
  69. {
  70. index.push_back(l->nradar);
  71. }
  72. if(std::find(index.begin(),index.end(),k) !=index.end())
  73. {
  74. radar_idx.push_back(k);
  75. }
  76. }
  77. }
  78. void RLfusion(LidarObject& lidar_object_vector,iv::radar::radarobjectarray& radar_object_array, iv::fusion::fusionobjectarray& lidar_radar_fusion_object_array)
  79. {
  80. lidar_radar_fusion_object_array.Clear();
  81. std::vector<match_index> match_idx;
  82. std::vector<int> radar_idx;
  83. Get_AssociationMat(lidar_object_vector,radar_object_array,match_idx,radar_idx);
  84. for(int i =0; i< match_idx.size(); i++)
  85. {
  86. iv::fusion::fusionobject fusion_object;
  87. fusion_object.set_id(lidar_object_vector.at(match_idx.at(i).nlidar).tracker_id);
  88. fusion_object.set_type_name(labels[lidar_object_vector.at(match_idx.at(i).nlidar).label]);
  89. fusion_object.set_prob(lidar_object_vector.at(match_idx.at(i).nlidar).robustness);
  90. if(match_idx.at(i).nradar == -1000)
  91. {
  92. // std::cout<<" lidar ok "<<std::endl;
  93. fusion_object.set_yaw(lidar_object_vector.at(match_idx.at(i).nlidar).yaw);
  94. fusion_object.set_lifetime(lidar_object_vector.at(match_idx.at(i).nlidar).visible_life);
  95. iv::fusion::VelXY vel_relative;
  96. iv::fusion::VelXY *vel_relative_;
  97. vel_relative.set_x(lidar_object_vector.at(match_idx.at(i).nlidar).velocity.x);
  98. vel_relative.set_y(lidar_object_vector.at(match_idx.at(i).nlidar).velocity.y);
  99. vel_relative_ = fusion_object.mutable_vel_relative();
  100. vel_relative_->CopyFrom(vel_relative);
  101. iv::fusion::VelXY vel_abs;
  102. iv::fusion::VelXY *vel_abs_;
  103. vel_abs.set_x(lidar_object_vector.at(match_idx.at(i).nlidar).velocity_abs.x);
  104. vel_abs.set_y(lidar_object_vector.at(match_idx.at(i).nlidar).velocity_abs.y);
  105. vel_abs_ = fusion_object.mutable_vel_abs();
  106. vel_abs_->CopyFrom(vel_abs);
  107. iv::fusion::PointXYZ centroid;
  108. iv::fusion::PointXYZ *centroid_;
  109. centroid.set_x(lidar_object_vector.at(match_idx.at(i).nlidar).location.x);
  110. centroid.set_y(lidar_object_vector.at(match_idx.at(i).nlidar).location.y);
  111. centroid.set_z(lidar_object_vector.at(match_idx.at(i).nlidar).location.z);
  112. centroid_ = fusion_object.mutable_centroid();
  113. centroid_->CopyFrom(centroid);
  114. }else {
  115. // std::cout<<" radar ok "<<std::endl;
  116. fusion_object.set_yaw(radar_object_array.obj(match_idx.at(i).nradar).angle());
  117. fusion_object.set_lifetime(radar_object_array.obj(match_idx.at(i).nradar).has_bridge_object());
  118. iv::fusion::VelXY vel_relative;
  119. iv::fusion::VelXY *vel_relative_;
  120. vel_relative.set_x(radar_object_array.obj(match_idx.at(i).nradar).vx());
  121. vel_relative.set_y(radar_object_array.obj(match_idx.at(i).nradar).vy());
  122. vel_relative_ = fusion_object.mutable_vel_relative();
  123. vel_relative_->CopyFrom(vel_relative);
  124. iv::fusion::VelXY vel_abs;
  125. iv::fusion::VelXY *vel_abs_;
  126. vel_abs.set_x(radar_object_array.obj(match_idx.at(i).nradar).vx());
  127. vel_abs.set_y(radar_object_array.obj(match_idx.at(i).nradar).vy());
  128. vel_abs_ = fusion_object.mutable_vel_abs();
  129. vel_abs_->CopyFrom(vel_abs);
  130. iv::fusion::PointXYZ centroid;
  131. iv::fusion::PointXYZ *centroid_;
  132. centroid.set_x(lidar_object_vector.at(match_idx.at(i).nradar).location.x);
  133. centroid.set_y(lidar_object_vector.at(match_idx.at(i).nradar).location.y);
  134. centroid.set_z(lidar_object_vector.at(match_idx.at(i).nradar).location.z);
  135. centroid_ = fusion_object.mutable_centroid();
  136. centroid_->CopyFrom(centroid);
  137. }
  138. iv::fusion::AccXY acc_relative;
  139. iv::fusion::AccXY *acc_relative_;
  140. acc_relative.set_x(lidar_object_vector.at(match_idx.at(i).nlidar).acceleration_abs.x);
  141. acc_relative.set_y(lidar_object_vector.at(match_idx.at(i).nlidar).acceleration_abs.y);
  142. acc_relative_ = fusion_object.mutable_acc_relative();
  143. acc_relative_->CopyFrom(acc_relative);
  144. iv::fusion::PointXYZ min_point;
  145. iv::fusion::PointXYZ *min_point_;
  146. min_point.set_x(lidar_object_vector.at(match_idx.at(i).nlidar).nearest_point.x);
  147. min_point.set_y(lidar_object_vector.at(match_idx.at(i).nlidar).nearest_point.y);
  148. min_point_ = fusion_object.mutable_min_point();
  149. min_point_->CopyFrom(min_point);
  150. iv::fusion::Dimension dimension;
  151. iv::fusion::Dimension *dimension_;
  152. dimension.set_x(lidar_object_vector.at(match_idx.at(i).nlidar).size.x);
  153. dimension.set_y(lidar_object_vector.at(match_idx.at(i).nlidar).size.y);
  154. dimension.set_z(lidar_object_vector.at(match_idx.at(i).nlidar).size.z);
  155. dimension_ = fusion_object.mutable_dimensions();
  156. dimension_->CopyFrom(dimension);
  157. if((lidar_object_vector.at(match_idx.at(i).nlidar).size.x>0)&&(lidar_object_vector.at(match_idx.at(i).nlidar).size.y>0))
  158. {
  159. int xp = (int)((lidar_object_vector.at(match_idx.at(i).nlidar).size.x/0.2)/2.0);
  160. if(xp == 0)xp=1;
  161. int yp = (int)((lidar_object_vector.at(match_idx.at(i).nlidar).size.y/0.2)/2.0);
  162. if(yp == 0)yp=1;
  163. int ix,iy;
  164. for(ix = 0; ix<(xp*2); ix++)
  165. {
  166. for(iy = 0; iy<(yp*2); iy++)
  167. {
  168. iv::fusion::NomalXYZ nomal_centroid;
  169. iv::fusion::NomalXYZ *nomal_centroid_;
  170. float nomal_x = ix*0.2 - xp*0.2;
  171. float nomal_y = iy*0.2 - yp*0.2;
  172. float nomal_z = lidar_object_vector.at(match_idx.at(i).nlidar).location.z;
  173. float s = nomal_x*cos(lidar_object_vector.at(match_idx.at(i).nlidar).yaw) - nomal_y*sin(lidar_object_vector.at(match_idx.at(i).nlidar).yaw);
  174. float t = nomal_x*sin(lidar_object_vector.at(match_idx.at(i).nlidar).yaw) + nomal_y*cos(lidar_object_vector.at(i).yaw);
  175. nomal_centroid.set_nomal_x(lidar_object_vector.at(match_idx.at(i).nlidar).location.x + s);
  176. nomal_centroid.set_nomal_y(lidar_object_vector.at(match_idx.at(i).nlidar).location.y+ t);
  177. nomal_centroid_ = fusion_object.add_nomal_centroid();
  178. nomal_centroid_->CopyFrom(nomal_centroid);
  179. }
  180. }
  181. }
  182. for(int k = 0; k<10; k++)
  183. {
  184. // std::cout<<"fusion begin"<<std::endl;
  185. iv::fusion::PointXYZ point_forcaste;
  186. iv::fusion::PointXYZ *point_forcaste_;
  187. float forcast_x = lidar_object_vector.at(match_idx.at(i).nlidar).location.x + lidar_object_vector.at(match_idx.at(i).nlidar).velocity.x*time_step*(k+1);
  188. float forcast_y = lidar_object_vector.at(match_idx.at(i).nlidar).location.y + lidar_object_vector.at(match_idx.at(i).nlidar).velocity.y*time_step*(k+1);
  189. point_forcaste.set_x(forcast_x);
  190. point_forcaste.set_y(forcast_y);
  191. point_forcaste.set_z(lidar_object_vector.at(match_idx.at(i).nlidar).location.z);
  192. point_forcaste_ = fusion_object.add_point_forecast();
  193. point_forcaste_->CopyFrom(point_forcaste);
  194. iv::fusion::NomalForecast forcast_normal;
  195. iv::fusion::NomalForecast *forcast_normal_;
  196. forcast_normal.set_forecast_index(i);
  197. // std::cout<<"fusion end"<<std::endl;
  198. if((lidar_object_vector.at(i).size.x>0)&&(lidar_object_vector.at(match_idx.at(i).nlidar).size.y>0))
  199. {
  200. int xp = (int)((lidar_object_vector.at(match_idx.at(i).nlidar).size.x/0.2)/2.0);
  201. if(xp == 0)xp=1;
  202. int yp = (int)((lidar_object_vector.at(match_idx.at(i).nlidar).size.y/0.2)/2.0);
  203. if(yp == 0)yp=1;
  204. int ix,iy;
  205. for(ix = 0; ix<(xp*2); ix++)
  206. {
  207. for(iy = 0; iy<(yp*2); iy++)
  208. {
  209. iv::fusion::NomalXYZ nomal_forcast;
  210. iv::fusion::NomalXYZ *nomal_forcast_;
  211. float nomal_x = ix*0.2 - xp*0.2;
  212. float nomal_y = iy*0.2 - yp*0.2;
  213. float nomal_z = lidar_object_vector.at(match_idx.at(i).nlidar).location.z;
  214. float s = nomal_x*cos(lidar_object_vector.at(match_idx.at(i).nlidar).yaw) - nomal_y*sin(lidar_object_vector.at(match_idx.at(i).nlidar).yaw);
  215. float t = nomal_x*sin(lidar_object_vector.at(match_idx.at(i).nlidar).yaw) + nomal_y*cos(lidar_object_vector.at(match_idx.at(i).nlidar).yaw);
  216. nomal_forcast.set_nomal_x(forcast_x + s);
  217. nomal_forcast.set_nomal_y(forcast_y + t);
  218. nomal_forcast_ = forcast_normal.add_forecast_nomal();
  219. nomal_forcast_->CopyFrom(nomal_forcast);
  220. }
  221. }
  222. }
  223. forcast_normal_=fusion_object.add_forecast_nomals();
  224. forcast_normal_->CopyFrom(forcast_normal);
  225. }
  226. iv::fusion::fusionobject *pobj = lidar_radar_fusion_object_array.add_obj();
  227. pobj->CopyFrom(fusion_object);
  228. }
  229. for(int j = 0; j< radar_idx.size() ; j++){
  230. if(radar_object_array.obj(j).bvalid() == false) continue;
  231. if(abs(radar_object_array.obj(j).x())<4 && radar_object_array.obj(j).y()< 100) continue;
  232. iv::fusion::fusionobject fusion_obj;
  233. fusion_obj.set_yaw(radar_object_array.obj(j).angle());
  234. iv::fusion::VelXY vel_relative;
  235. iv::fusion::VelXY *vel_relative_;
  236. vel_relative.set_x(radar_object_array.obj(j).vx());
  237. vel_relative.set_y(radar_object_array.obj(j).vy());
  238. vel_relative_ = fusion_obj.mutable_vel_relative();
  239. vel_relative_->CopyFrom(vel_relative);
  240. iv::fusion::PointXYZ centroid;
  241. iv::fusion::PointXYZ *centroid_;
  242. centroid.set_x(radar_object_array.obj(j).x());
  243. centroid.set_y(radar_object_array.obj(j).y());
  244. centroid.set_z(1.0);
  245. centroid_ = fusion_obj.mutable_centroid();
  246. centroid_->CopyFrom(centroid);
  247. iv::fusion::Dimension dimension;
  248. iv::fusion::Dimension *dimension_;
  249. dimension.set_x(0.5);
  250. dimension.set_y(0.5);
  251. dimension.set_z(1.0);
  252. dimension_ = fusion_obj.mutable_dimensions();
  253. dimension_->CopyFrom(dimension);
  254. int xp = (int)((0.5/0.2)/2.0);
  255. if(xp == 0)xp=1;
  256. int yp = (int)((0.5/0.2)/2.0);
  257. if(yp == 0)yp=1;
  258. int ix,iy;
  259. for(ix = 0; ix<(xp*2); ix++)
  260. {
  261. for(iy = 0; iy<(yp*2); iy++)
  262. {
  263. iv::fusion::NomalXYZ nomal_centroid;
  264. iv::fusion::NomalXYZ *nomal_centroid_;
  265. float nomal_x = ix*0.2 - xp*0.2;
  266. float nomal_y = iy*0.2 - yp*0.2;
  267. float nomal_z = 1.0;
  268. float s = nomal_x*cos(radar_object_array.obj(j).angle()) - nomal_y*sin(radar_object_array.obj(j).angle());
  269. float t = nomal_x*sin(radar_object_array.obj(j).angle()) + nomal_y*cos(radar_object_array.obj(j).angle());
  270. nomal_centroid.set_nomal_x(radar_object_array.obj(j).x() + s);
  271. nomal_centroid.set_nomal_y(radar_object_array.obj(j).y() + t);
  272. nomal_centroid_ = fusion_obj.add_nomal_centroid();
  273. nomal_centroid_->CopyFrom(nomal_centroid);
  274. }
  275. }
  276. for(int k = 0; k<10; k++)
  277. {
  278. // std::cout<<"fusion begin"<<std::endl;
  279. iv::fusion::PointXYZ point_forcaste;
  280. iv::fusion::PointXYZ *point_forcaste_;
  281. float forcast_x = radar_object_array.obj(j).x() + radar_object_array.obj(j).vx()*time_step*(k+1);
  282. float forcast_y = radar_object_array.obj(j).y() + radar_object_array.obj(j).vy()*time_step*(k+1);
  283. point_forcaste.set_x(forcast_x);
  284. point_forcaste.set_y(forcast_y);
  285. point_forcaste.set_z(1.0);
  286. point_forcaste_ = fusion_obj.add_point_forecast();
  287. point_forcaste_->CopyFrom(point_forcaste);
  288. iv::fusion::NomalForecast forcast_normal;
  289. iv::fusion::NomalForecast *forcast_normal_;
  290. forcast_normal.set_forecast_index(j);
  291. int xp = (int)((0.5/0.2)/2.0);
  292. if(xp == 0)xp=1;
  293. int yp = (int)((0.5/0.2)/2.0);
  294. if(yp == 0)yp=1;
  295. int ix,iy;
  296. for(ix = 0; ix<(xp*2); ix++)
  297. {
  298. for(iy = 0; iy<(yp*2); iy++)
  299. {
  300. iv::fusion::NomalXYZ nomal_forcast;
  301. iv::fusion::NomalXYZ *nomal_forcast_;
  302. float nomal_x = ix*0.2 - xp*0.2;
  303. float nomal_y = iy*0.2 - yp*0.2;
  304. float nomal_z = 1.0;
  305. float s = nomal_x*cos(radar_object_array.obj(j).angle()) - nomal_y*sin(radar_object_array.obj(j).angle());
  306. float t = nomal_x*sin(radar_object_array.obj(j).angle()) + nomal_y*cos(radar_object_array.obj(j).angle());
  307. nomal_forcast.set_nomal_x(forcast_x + s);
  308. nomal_forcast.set_nomal_y(forcast_y + t);
  309. nomal_forcast_ = forcast_normal.add_forecast_nomal();
  310. nomal_forcast_->CopyFrom(nomal_forcast);
  311. }
  312. }
  313. forcast_normal_=fusion_obj.add_forecast_nomals();
  314. forcast_normal_->CopyFrom(forcast_normal);
  315. }
  316. iv::fusion::fusionobject *obj = lidar_radar_fusion_object_array.add_obj();
  317. obj->CopyFrom(fusion_obj);
  318. }
  319. }
  320. }
  321. }
  322. #endif // FUSION_HPP