main.cpp 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762
  1. #include <QCoreApplication>
  2. #include <QDateTime>
  3. #include <iostream>
  4. #include "pointpillars.h"
  5. #include <iostream>
  6. #include <pcl/point_cloud.h>
  7. #include <pcl/point_types.h>
  8. #include <pcl/io/io.h>
  9. #include <pcl/io/pcd_io.h>
  10. #include "xmlparam.h"
  11. #include "modulecomm.h"
  12. #include "ivfault.h"
  13. #include "ivlog.h"
  14. #include "ivexit.h"
  15. #include "ivversion.h"
  16. #include <thread>
  17. #include "objectarray.pb.h"
  18. //#include "ivbacktrace.h"
  19. #include "Tracking.hpp"
  20. #include "roiaware_pool3d.h"
  21. #include "Eigen/Dense"
  22. iv::Ivfault *gfault = nullptr;
  23. iv::Ivlog *givlog = nullptr;
  24. std::thread * gpthread;
  25. PointPillars * pPillars = nullptr ;
  26. void * gpa;
  27. void * gpdetect;
  28. int gnothavedatatime = 0;
  29. const int kNumPointFeature = 5;
  30. const int kOutputNumBoxFeature = 7;
  31. std::string gstrinput;
  32. std::string gstroutput;
  33. Eigen::Matrix3d rotation_matrix;
  34. Eigen::Vector3d trans_matrix;
  35. TrackerSettings settings;
  36. CTracker tracker(settings);
  37. bool m_isTrackerInitialized = false;
  38. #include <random>
  39. ////////////////////用于nms////////////////////
  40. #include<opencv2/opencv.hpp>
  41. #define rad2Angle(rad) ((rad) * 180.0 / M_PI)
  42. const float smallinbig_threshold = 0.8;
  43. const float distance_threshold = 0.1;
  44. const float secondnms_threshold = 0.1;
  45. typedef struct {
  46. cv::RotatedRect box;
  47. std::vector<float> detection;
  48. std::vector<float> bbox_pts;
  49. int label;
  50. float score;
  51. }BBOX3D;
  52. //将检测结果转为RotatedRect以便于nms计算
  53. bool GetRotatedRect(std::vector<float> &out_detections,std::vector<int> &out_labels,
  54. std::vector<float> &out_scores, std::vector<BBOX3D> &results)
  55. {
  56. int obj_size = out_detections.size()/kOutputNumBoxFeature;
  57. if(out_labels.size()==obj_size && out_scores.size()==obj_size)
  58. {
  59. for(int i=0;i<obj_size;i++)
  60. {
  61. BBOX3D result;
  62. result.box = cv::RotatedRect(cv::Point2f(out_detections.at(i*7),out_detections.at(i*7+1)),
  63. cv::Size2f(out_detections.at(i*7+3),out_detections.at(i*7+4)),
  64. rad2Angle(out_detections.at(i*7+6)));
  65. for(int j=0;j<kOutputNumBoxFeature;j++)
  66. result.detection.push_back(out_detections.at(i*7+j));
  67. result.label = out_labels.at(i);
  68. result.score = out_scores.at(i);
  69. results.push_back(result);
  70. }
  71. return true;
  72. }
  73. else
  74. {
  75. std::cout<<"the size of detections labels scores is not equal !!!"<<std::endl;
  76. return false;
  77. }
  78. }
  79. bool sort_score(BBOX3D box1,BBOX3D box2)
  80. {
  81. return (box1.score > box2.score);
  82. }
  83. //计算两个旋转矩形的IOU
  84. float calcIOU(cv::RotatedRect rect1, cv::RotatedRect rect2)
  85. {
  86. float areaRect1 = rect1.size.width * rect1.size.height;
  87. float areaRect2 = rect2.size.width * rect2.size.height;
  88. vector<cv::Point2f> vertices;
  89. int intersectionType = cv::rotatedRectangleIntersection(rect1, rect2, vertices);
  90. if (vertices.size()==0)
  91. return 0.0;
  92. else{
  93. vector<cv::Point2f> order_pts;
  94. cv::convexHull(cv::Mat(vertices), order_pts, true);
  95. double area = cv::contourArea(order_pts);
  96. float inner = (float) (area / (areaRect1 + areaRect2 - area + 0.0001));
  97. //排除小框完全在大框里面的case
  98. float areaMin = (areaRect1 < areaRect2)?areaRect1:areaRect2;
  99. float innerMin = (float)(area / (areaMin + 0.0001));
  100. if(innerMin > smallinbig_threshold)
  101. inner = innerMin;
  102. return inner;
  103. }
  104. }
  105. //计算两个点的欧式距离
  106. float calcdistance(cv::Point2f center1, cv::Point2f center2)
  107. {
  108. float distance = sqrt((center1.x-center2.x)*(center1.x-center2.x)+
  109. (center1.y-center2.y)*(center1.y-center2.y));
  110. return distance;
  111. }
  112. //nms
  113. void nms(std::vector<BBOX3D> &vec_boxs,float threshold,std::vector<BBOX3D> &results)
  114. {
  115. std::sort(vec_boxs.begin(),vec_boxs.end(),sort_score);
  116. while(vec_boxs.size() > 0)
  117. {
  118. results.push_back(vec_boxs[0]);
  119. vec_boxs.erase(vec_boxs.begin());
  120. for (auto it = vec_boxs.begin(); it != vec_boxs.end();)
  121. {
  122. float iou_value =calcIOU(results.back().box,(*it).box);
  123. float distance_value = calcdistance(results.back().box.center,(*it).box.center);
  124. if ((iou_value > threshold) || (distance_value<distance_threshold))
  125. it = vec_boxs.erase(it);
  126. else it++;
  127. }
  128. // std::cout<<"results: "<<results.back().detection.at(0)<<" "<<results.back().detection.at(1)<<
  129. // " "<<results.back().detection.at(2)<<std::endl;
  130. }
  131. }
  132. void GetLidarObj(std::vector<BBOX3D> &results,iv::lidar::objectarray & lidarobjvec)
  133. {
  134. int i;
  135. int obj_size = results.size();
  136. // givlog->verbose("OBJ","object size is %d",obj_size);;
  137. for(i=0;i<obj_size;i++)
  138. {
  139. iv::lidar::lidarobject lidarobj;
  140. if (results.at(i).score < 0.10) {
  141. std::cout<<"///////: "<<results.at(i).score<<std::endl;
  142. continue;
  143. }
  144. //if (results.at(i).label == 5) continue;
  145. vector<float>out_detection = results.at(i).detection;
  146. lidarobj.set_tyaw(out_detection.at(6));
  147. iv::lidar::PointXYZ centroid;
  148. iv::lidar::PointXYZ * _centroid;
  149. centroid.set_x(out_detection.at(0));
  150. centroid.set_y(out_detection.at(1));
  151. centroid.set_z(out_detection.at(2));
  152. _centroid = lidarobj.mutable_centroid();
  153. _centroid->CopyFrom(centroid);
  154. iv::lidar::PointXYZ min_point;
  155. iv::lidar::PointXYZ * _min_point;
  156. min_point.set_x(0);
  157. min_point.set_y(0);
  158. min_point.set_z(0);
  159. _min_point = lidarobj.mutable_min_point();
  160. _min_point->CopyFrom(min_point);
  161. iv::lidar::PointXYZ max_point;
  162. iv::lidar::PointXYZ * _max_point;
  163. max_point.set_x(0);
  164. max_point.set_y(0);
  165. max_point.set_z(0);
  166. _max_point = lidarobj.mutable_max_point();
  167. _max_point->CopyFrom(max_point);
  168. iv::lidar::PointXYZ position;
  169. iv::lidar::PointXYZ * _position;
  170. position.set_x(out_detection.at(0));
  171. position.set_y(out_detection.at(1));
  172. position.set_z(out_detection.at(2));
  173. _position = lidarobj.mutable_position();
  174. _position->CopyFrom(position);
  175. lidarobj.set_mntype(results.at(i).label);
  176. // label 2 8
  177. if(results.at(i).label==2){
  178. lidarobj.set_mntype(8);
  179. }else if(results.at(i).label==8){
  180. lidarobj.set_mntype(2);
  181. }
  182. lidarobj.set_score(results.at(i).score);
  183. lidarobj.add_type_probs(results.at(i).score);
  184. iv::lidar::PointXYZI point_cloud;
  185. iv::lidar::PointXYZI * _point_cloud;
  186. point_cloud.set_x(out_detection.at(0));
  187. point_cloud.set_y(out_detection.at(1));
  188. point_cloud.set_z(out_detection.at(2));
  189. point_cloud.set_i(results.at(i).label);
  190. _point_cloud = lidarobj.add_cloud();
  191. _point_cloud->CopyFrom(point_cloud);
  192. iv::lidar::Dimension ld;
  193. iv::lidar::Dimension * pld;
  194. ld.set_x(out_detection.at(3));
  195. ld.set_y(out_detection.at(4));
  196. ld.set_z(out_detection.at(5));
  197. pld = lidarobj.mutable_dimensions();
  198. pld->CopyFrom(ld);
  199. // std::cout<<"x y z: "<<out_detection.at(0)<<" "<<out_detection.at(1)<<" "<<
  200. // out_detection.at(2)<<" "<<out_detection.at(3)<<" "<< out_detection.at(4)<<" "
  201. // <<out_detection.at(5)<<" "<<out_detection.at(6)<<std::endl;
  202. iv::lidar::lidarobject * po = lidarobjvec.add_obj();
  203. po->CopyFrom(lidarobj);
  204. }
  205. // std::cout<<"the lidarobjvec: "<<lidarobjvec.obj_size()<<std::endl;
  206. }
  207. ////////////////////用于nms////////////////////
  208. ////////////////////用于获得3dbbox中点云个数////////////////////
  209. #if 0
  210. inline void lidar_to_local_coords_cpu(float shift_x, float shift_y, float rot_angle, float &local_x, float &local_y){
  211. float cosa = cos(-rot_angle), sina = sin(-rot_angle);
  212. local_x = shift_x * cosa + shift_y * (-sina);
  213. local_y = shift_x * sina + shift_y * cosa;
  214. }
  215. inline int check_pt_in_box3d_cpu(const float *pt, std::vector<float> &box3d, float &local_x, float &local_y){
  216. // param pt: (x, y, z)
  217. // param box3d: [x, y, z, dx, dy, dz, heading], (x, y, z) is the box center
  218. const float MARGIN = 1e-2;
  219. float x = pt[0], y = pt[1], z = pt[2];
  220. float cx = box3d[0], cy = box3d[1], cz = box3d[2];
  221. float dx = box3d[3], dy = box3d[4], dz = box3d[5], rz = box3d[6];
  222. if (fabsf(z - cz) > dz / 2.0) return 0;
  223. lidar_to_local_coords_cpu(x - cx, y - cy, rz, local_x, local_y);
  224. float in_flag = (fabs(local_x) < dx / 2.0 + MARGIN) & (fabs(local_y) < dy / 2.0 + MARGIN);
  225. return in_flag;
  226. }
  227. int points_in_boxes_cpu(std::vector<BBOX3D>& boxes, float* pts_lidar,
  228. int pts_num, std::vector<std::vector<int>>& pts_indices){
  229. std::vector<std::vector<float>> pts_bboxes;
  230. int boxes_num = boxes.size();
  231. float local_x = 0, local_y = 0;
  232. for (int i = 0; i < boxes_num; i++){
  233. std::vector<float>pts_bbox;
  234. for (int j = 0; j < pts_num; j++){
  235. int cur_in_flag = check_pt_in_box3d_cpu(pts_lidar + j * 5, boxes[i].detection, local_x, local_y);
  236. pts_indices[i][j] = cur_in_flag;
  237. if(cur_in_flag)
  238. {
  239. pts_bbox.push_back(pts_lidar[j*5+0]);
  240. pts_bbox.push_back(pts_lidar[j*5+1]);
  241. pts_bbox.push_back(pts_lidar[j*5+2]);
  242. pts_bbox.push_back(pts_lidar[j*5+3]);
  243. pts_bbox.push_back(pts_lidar[j*5+4]);
  244. }
  245. }
  246. pts_bboxes.push_back(pts_bbox);
  247. std::cout<<"the size of points: "<<i<<" : "<<pts_bbox.size() / 5 <<std::endl;
  248. pts_bbox.clear();
  249. }
  250. return 1;
  251. }
  252. #endif
  253. ////////////////////用于获得3dbbox中点云个数////////////////////
  254. void PclToArray(
  255. const pcl::PointCloud<pcl::PointXYZI>::Ptr& in_pcl_pc_ptr,
  256. float* out_points_array, const float normalizing_factor) {
  257. for (size_t i = 0; i < in_pcl_pc_ptr->size(); ++i) {
  258. pcl::PointXYZI point = in_pcl_pc_ptr->at(i);
  259. out_points_array[i * 4 + 0] = point.x;
  260. out_points_array[i * 4 + 1] = point.y;
  261. out_points_array[i * 4 + 2] = point.z;
  262. out_points_array[i * 4 + 3] =
  263. static_cast<float>(point.intensity / normalizing_factor);
  264. }
  265. }
  266. void PclXYZITToArray(
  267. const pcl::PointCloud<pcl::PointXYZI>::Ptr& in_pcl_pc_ptr,
  268. float* out_points_array, const float normalizing_factor) {
  269. /////shuffle the index array/////
  270. bool shuffle = true;
  271. int point_num = in_pcl_pc_ptr->size();
  272. std::vector<int>indices(point_num);
  273. std::iota(indices.begin(),indices.end(),0);
  274. if(shuffle)
  275. {
  276. // unsigned seed = 0;
  277. // std::shuffle(indices.begin(),indices.end(),std::default_random_engine(seed));
  278. std::random_device rd;
  279. std::mt19937 g(rd());
  280. std::shuffle(indices.begin(),indices.end(),g);
  281. }
  282. /////shuffle the index array/////
  283. for (size_t i = 0; i < in_pcl_pc_ptr->size(); ++i) {
  284. //pcl::PointXYZI point = in_pcl_pc_ptr->at(i);
  285. int indice = indices[i];
  286. pcl::PointXYZI point = in_pcl_pc_ptr->at(indice);
  287. Eigen::Vector3d new_point, old_point;
  288. old_point<<point.x, point.y, point.z;
  289. new_point = rotation_matrix * (old_point) + trans_matrix;
  290. out_points_array[i * 5 + 0] = new_point[0];
  291. out_points_array[i * 5 + 1] = new_point[1];
  292. out_points_array[i * 5 + 2] = new_point[2];
  293. out_points_array[i * 5 + 3] =
  294. static_cast<float>(point.intensity / normalizing_factor);
  295. out_points_array[i * 5 + 4] = 0;
  296. }
  297. }
  298. void GetLidarObj(std::vector<float> out_detections,std::vector<int> out_labels,
  299. std::vector<float> out_scores,iv::lidar::objectarray & lidarobjvec)
  300. {
  301. int i;
  302. int obj_size = out_detections.size()/kOutputNumBoxFeature;
  303. // givlog->verbose("OBJ","object size is %d",obj_size);
  304. for(i=0;i<obj_size;i++)
  305. {
  306. iv::lidar::lidarobject lidarobj;
  307. if (out_scores.at(i) < 0.10) continue;
  308. lidarobj.set_tyaw(out_detections.at(i*7+6));
  309. iv::lidar::PointXYZ centroid;
  310. iv::lidar::PointXYZ * _centroid;
  311. centroid.set_x(out_detections.at(i*7));
  312. centroid.set_y(out_detections.at(i*7+1));
  313. centroid.set_z(out_detections.at(i*7+2));
  314. _centroid = lidarobj.mutable_centroid();
  315. _centroid->CopyFrom(centroid);
  316. iv::lidar::PointXYZ min_point;
  317. iv::lidar::PointXYZ * _min_point;
  318. min_point.set_x(0);
  319. min_point.set_y(0);
  320. min_point.set_z(0);
  321. _min_point = lidarobj.mutable_min_point();
  322. _min_point->CopyFrom(min_point);
  323. iv::lidar::PointXYZ max_point;
  324. iv::lidar::PointXYZ * _max_point;
  325. max_point.set_x(0);
  326. max_point.set_y(0);
  327. max_point.set_z(0);
  328. _max_point = lidarobj.mutable_max_point();
  329. _max_point->CopyFrom(max_point);
  330. iv::lidar::PointXYZ position;
  331. iv::lidar::PointXYZ * _position;
  332. position.set_x(out_detections.at(i*7));
  333. position.set_y(out_detections.at(i*7+1));
  334. position.set_z(out_detections.at(i*7+2));
  335. _position = lidarobj.mutable_position();
  336. _position->CopyFrom(position);
  337. lidarobj.set_mntype(out_labels.at(i));
  338. // label 2 8
  339. if(out_labels.at(i)==2){
  340. lidarobj.set_mntype(8);
  341. }else if(out_labels.at(i)==8){
  342. lidarobj.set_mntype(2);
  343. }
  344. lidarobj.set_score(out_scores.at(i));
  345. lidarobj.add_type_probs(out_scores.at(i));
  346. iv::lidar::PointXYZI point_cloud;
  347. iv::lidar::PointXYZI * _point_cloud;
  348. point_cloud.set_x(out_detections.at(i*7));
  349. point_cloud.set_y(out_detections.at(i*7+1));
  350. point_cloud.set_z(out_detections.at(i*7+2));
  351. point_cloud.set_i(0);
  352. _point_cloud = lidarobj.add_cloud();
  353. _point_cloud->CopyFrom(point_cloud);
  354. iv::lidar::Dimension ld;
  355. iv::lidar::Dimension * pld;
  356. ld.set_x(out_detections.at(i*7+3));// w
  357. ld.set_y(out_detections.at(i*7+4));// l
  358. ld.set_z(out_detections.at(i*7+5));// h
  359. pld = lidarobj.mutable_dimensions();
  360. pld->CopyFrom(ld);
  361. // std::cout<<"x y z : "<<out_detections.at(i*7+3)<<" "<< out_detections.at(i*7+4)<<" "<<out_detections.at(i*7+5)<<std::endl;
  362. iv::lidar::lidarobject * po = lidarobjvec.add_obj();
  363. po->CopyFrom(lidarobj);
  364. }
  365. }
  366. void DectectOnePCD(const pcl::PointCloud<pcl::PointXYZI>::Ptr &pc_ptr)
  367. {
  368. std::shared_ptr<float> points_array_ptr = std::shared_ptr<float>(new float[pc_ptr->size() * kNumPointFeature]);
  369. // float* points_array = new float[pc_ptr->size() * kNumPointFeature];
  370. PclXYZITToArray(pc_ptr, points_array_ptr.get(), 1.0);
  371. int in_num_points = pc_ptr->width;
  372. std::vector<float> out_detections;
  373. std::vector<int> out_labels;
  374. std::vector<float> out_scores;
  375. QTime xTime;
  376. xTime.start();
  377. auto startTime = std::chrono::high_resolution_clock::now();
  378. cudaDeviceSynchronize();
  379. pPillars->DoInference(points_array_ptr.get(), in_num_points, &out_detections, &out_labels , &out_scores);
  380. cudaDeviceSynchronize();
  381. auto endTime = std::chrono::high_resolution_clock::now();
  382. double inferenceDuration = std::chrono::duration_cast<std::chrono::nanoseconds>(endTime - startTime).count()/1000000.0;
  383. // std::cout<< "inferenceDuration Time: " << inferenceDuration << " ms"<< std::endl;
  384. // int BoxFeature = 7;
  385. // int num_objects = out_detections.size() / BoxFeature;
  386. // givlog->verbose("obj size is %d", num_objects);
  387. // std::cout<<"obj size is "<<num_objects<<std::endl;
  388. // iv::lidar::objectarray lidarobjvec;
  389. // GetLidarObj(out_detections,out_labels,out_scores,lidarobjvec);
  390. //////////nms//////////
  391. //startTime = std::chrono::high_resolution_clock::now();
  392. std::vector<BBOX3D>results_rect;
  393. GetRotatedRect(out_detections,out_labels,out_scores,results_rect);
  394. // std::cout<<"results_rect size: "<<results_rect.size()<<std::endl;
  395. std::vector<BBOX3D>results_bbox;
  396. nms(results_rect,secondnms_threshold,results_bbox);
  397. // std::cout<<"results_bbox size: "<<results_bbox.size()<<std::endl;
  398. //get lidar points in 3Dbbox in cpu
  399. // startTime = std::chrono::high_resolution_clock::now();
  400. // //get lidar points in 3Dbbox
  401. // int boxes_num = results_bbox.size();
  402. // std::vector<std::vector<int>>pts_indices(boxes_num, vector<int>(in_num_points, 0));
  403. // points_in_boxes_cpu(results_bbox,points_array_ptr.get(),in_num_points,pts_indices);
  404. // endTime = std::chrono::high_resolution_clock::now();
  405. // double nmsDuration = std::chrono::duration_cast<std::chrono::nanoseconds>(endTime - startTime).count()/1000000.0;
  406. // std::cout <<"3DBoxDuration Time : "<<nmsDuration<< endl;
  407. //get lidar points in 3Dbbox in gpu
  408. startTime = std::chrono::high_resolution_clock::now();
  409. float* dev_points;
  410. GPU_CHECK(cudaMalloc(reinterpret_cast<void**>(&dev_points),
  411. in_num_points * 5 * sizeof(float))); // in_num_points , 5
  412. GPU_CHECK(cudaMemset(dev_points, 0, in_num_points * 5 * sizeof(float)));
  413. GPU_CHECK(cudaMemcpy(dev_points, points_array_ptr.get(),
  414. in_num_points * 5 * sizeof(float),
  415. cudaMemcpyHostToDevice));
  416. int* box_idx_of_points_gpu;
  417. GPU_CHECK(cudaMalloc(reinterpret_cast<void**>(&box_idx_of_points_gpu),
  418. in_num_points * sizeof(int))); // in_num_points , 5
  419. GPU_CHECK(cudaMemset(box_idx_of_points_gpu, -1, in_num_points * sizeof(float)));
  420. int boxes_num = results_bbox.size();
  421. float *boxes_cpu = new float[boxes_num*7];
  422. for(int i=0;i<boxes_num;i++)
  423. {
  424. for(int j=0;j<7;j++)
  425. *(boxes_cpu + (i*7+j)) = results_bbox[i].detection[j];
  426. }
  427. float *boxes_gpu;
  428. GPU_CHECK(cudaMalloc(reinterpret_cast<void**>(&boxes_gpu),
  429. boxes_num * 7 * sizeof(float))); // in_num_points , 5
  430. GPU_CHECK(cudaMemset(boxes_gpu, 0, boxes_num * 7 * sizeof(float)));
  431. GPU_CHECK(cudaMemcpy(boxes_gpu, boxes_cpu,boxes_num * 7 * sizeof(float),
  432. cudaMemcpyHostToDevice));
  433. int batch_size = 1;
  434. points_in_boxes_launcher(batch_size,boxes_num,in_num_points,boxes_gpu,dev_points,box_idx_of_points_gpu);
  435. int* box_idx_of_points_cpu = new int[in_num_points]();
  436. cudaMemcpy(box_idx_of_points_cpu, box_idx_of_points_gpu, in_num_points * sizeof(int), cudaMemcpyDeviceToHost);
  437. //vector<int> box_idx_of_points(box_idx_of_points_cpu,box_idx_of_points_cpu+in_num_points);
  438. //cv::Mat image=cv::Mat::zeros(1200,1200,CV_8UC3);
  439. //存储bbox的点云
  440. for(int i=0; i < in_num_points; i++)
  441. {
  442. for(int j=0; j<boxes_num; j++)
  443. {
  444. if (box_idx_of_points_cpu[i] == j)
  445. {
  446. for(int idx=0; idx<5; idx++)
  447. results_bbox[j].bbox_pts.push_back(points_array_ptr.get()[i*5+idx]);
  448. // int x = int(points_array_ptr.get()[i*5]*10+600);
  449. // int y = int(points_array_ptr.get()[i*5+1]*10+600);
  450. // cv::circle(image,cv::Point(x,y),2,cv::Scalar(0,0,255));
  451. }
  452. }
  453. }
  454. // for(int j=0; j<boxes_num; j++)
  455. // {
  456. // std::cout<<"num points in bbox: "<<results_bbox[j].bbox_pts.size()/5<<std::endl;
  457. // }
  458. endTime = std::chrono::high_resolution_clock::now();
  459. double gpuDuration = std::chrono::duration_cast<std::chrono::nanoseconds>(endTime - startTime).count()/1000000.0;
  460. // std::cout <<"3DBoxDuration_gpu Time : "<<gpuDuration<< endl;
  461. //endTime = std::chrono::high_resolution_clock::now();
  462. //double nmsDuration = std::chrono::duration_cast<std::chrono::nanoseconds>(endTime - startTime).count()/1000000.0;
  463. //std::cout <<"nmsDuration Time : "<<(double)(ends - start)/ CLOCKS_PER_SEC*1000 << endl;
  464. iv::lidar::objectarray lidarobjvec;
  465. GetLidarObj(results_bbox,lidarobjvec);
  466. //////////nms//////////
  467. double timex = pc_ptr->header.stamp;
  468. timex = timex/1000.0;
  469. lidarobjvec.set_timestamp(pc_ptr->header.stamp);
  470. //--------------------------------------------- init tracker -------------------------------------------------
  471. // if (!m_isTrackerInitialized)
  472. // {
  473. // m_isTrackerInitialized = InitTracker(tracker);
  474. // if (!m_isTrackerInitialized)
  475. // {
  476. // std::cerr << "Tracker initialize error!!!" << std::endl;
  477. // }
  478. // }
  479. // iv::lidar::objectarray trackedobjvec = Tracking(lidarobjvec, tracker);
  480. //-------------------------------------------- end tracking --------------------------------------------------
  481. int ntlen;
  482. std::string out = lidarobjvec.SerializeAsString();
  483. iv::modulecomm::ModuleSendMsg(gpdetect,out.data(),out.length());
  484. // givlog->verbose("lenth is %d",out.length());
  485. }
  486. void ListenPointCloud(const char *strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
  487. {
  488. // std::cout<<" is ok ------------ "<<std::endl;
  489. if(nSize <=16)return;
  490. unsigned int * pHeadSize = (unsigned int *)strdata;
  491. if(*pHeadSize > nSize)
  492. {
  493. givlog->verbose("ListenPointCloud data is small headsize = %d, data size is %d", *pHeadSize, nSize);
  494. std::cout<<"ListenPointCloud data is small headsize ="<<*pHeadSize<<" data size is"<<nSize<<std::endl;
  495. }
  496. gnothavedatatime = 0;
  497. QTime xTime;
  498. xTime.start();
  499. pcl::PointCloud<pcl::PointXYZI>::Ptr point_cloud(
  500. new pcl::PointCloud<pcl::PointXYZI>());
  501. int nNameSize;
  502. nNameSize = *pHeadSize - 4-4-8;
  503. char * strName = new char[nNameSize+1];strName[nNameSize] = 0;
  504. std::shared_ptr<char> str_ptr;
  505. str_ptr.reset(strName);
  506. memcpy(strName,(char *)((char *)strdata +4),nNameSize);
  507. point_cloud->header.frame_id = strName;
  508. memcpy(&point_cloud->header.seq,(char *)strdata+4+nNameSize,4);
  509. memcpy(&point_cloud->header.stamp,(char *)strdata+4+nNameSize+4,8);
  510. int nPCount = (nSize - *pHeadSize)/sizeof(pcl::PointXYZI);
  511. int i;
  512. pcl::PointXYZI * p;
  513. p = (pcl::PointXYZI *)((char *)strdata + *pHeadSize);
  514. for(i=0;i<nPCount;i++)
  515. {
  516. pcl::PointXYZI xp;
  517. memcpy(&xp,p,sizeof(pcl::PointXYZI));
  518. xp.z = xp.z;p++;
  519. if (((abs(xp.x)<0.5)&&(xp.y<0.5 && xp.y > -1.0)) || xp.z > 3.0 ) continue;
  520. point_cloud->push_back(xp);
  521. }
  522. DectectOnePCD(point_cloud);
  523. std::cout<<"time is "<<(QDateTime::currentMSecsSinceEpoch() % 1000)<<" "<<xTime.elapsed()<<std::endl;
  524. gfault->SetFaultState(0, 0, "ok");
  525. }
  526. bool gbstate = true;
  527. void statethread()
  528. {
  529. int nstate = 0;
  530. int nlaststate = 0;
  531. while (gbstate)
  532. {
  533. std::this_thread::sleep_for(std::chrono::milliseconds(10));
  534. if(gnothavedatatime < 100000) gnothavedatatime++;
  535. if (gnothavedatatime < 100){
  536. nstate = 0;
  537. }
  538. if (gnothavedatatime > 1000)
  539. {
  540. nstate = 1;
  541. }
  542. if (gnothavedatatime > 6000)
  543. {
  544. nstate = 2;
  545. }
  546. if (nstate != nlaststate) {
  547. switch (nstate) {
  548. case 0:
  549. givlog->info("detection_lidar_pointpillar is ok");
  550. gfault->SetFaultState(0,0,"data is ok.");
  551. break;
  552. case 1:
  553. givlog->info(" more than 10 seconds not have lidar pointcloud.");
  554. gfault->SetFaultState(1,1,"more than 10 seconds not have lidar pointcloud.");
  555. break;
  556. case 2:
  557. givlog->info(" more than 60 seconds not have lidar pointcloud.");
  558. gfault->SetFaultState(2,2, "more than 60 seconds not have lidar pointcloud.");
  559. break;
  560. default:
  561. break;
  562. }
  563. }
  564. }
  565. }
  566. void exitfunc()
  567. {
  568. gbstate = false;
  569. gpthread->join();
  570. std::cout<<" state thread closed."<<std::endl;
  571. iv::modulecomm::Unregister(gpa);
  572. iv::modulecomm::Unregister(gpdetect);
  573. std::cout<<"exit func complete"<<std::endl;
  574. }
  575. #include <QFile>
  576. bool trtisexist(std::string strpfe,std::string strbackbone)
  577. {
  578. QFile xFile;
  579. xFile.setFileName(strpfe.data());
  580. if(xFile.exists() == false)
  581. {
  582. return false;
  583. }
  584. xFile.setFileName(strbackbone.data());
  585. if(xFile.exists() == false)
  586. {
  587. return false;
  588. }
  589. return true;
  590. }
  591. int main(int argc, char *argv[])
  592. {
  593. QCoreApplication a(argc, argv);
  594. // RegisterIVBackTrace();
  595. tracker.setSettings(settings);
  596. gfault = new iv::Ivfault("lidar_pointpillar");
  597. givlog = new iv::Ivlog("lidar_pointpillar");
  598. gfault->SetFaultState(0,0,"pointpillar initialize. ");
  599. char * strhome = getenv("HOME");
  600. std::string pfe_file = strhome;
  601. pfe_file += "/models/lidar/cbgs_pp_multihead_pfe.onnx";
  602. std::string pfe_trt_file = pfe_file.substr(0, pfe_file.find(".")) + ".trt";
  603. std::string backbone_file = strhome;
  604. backbone_file += "/models/lidar/cbgs_pp_multihead_backbone.onnx";
  605. std::string backbone_trt_file = backbone_file.substr(0, backbone_file.find(".")) + ".trt";
  606. bool btrtexist = trtisexist(pfe_trt_file,backbone_trt_file);
  607. QString strpath = QCoreApplication::applicationDirPath();
  608. std::string pp_config = strpath.toStdString() ;
  609. pp_config += "/cfgs/cbgs_pp_multihead.yaml";
  610. if (argc < 2)
  611. strpath = strpath + "/detection_lidar_pointpillar.xml";
  612. else
  613. strpath = argv[1];
  614. std::cout<<pp_config<<std::endl;
  615. iv::xmlparam::Xmlparam xparam(strpath.toStdString());
  616. pfe_file = xparam.GetParam("pfe_file",pfe_file.data());
  617. backbone_file = xparam.GetParam("backbone_file",backbone_file.data());
  618. gstrinput = xparam.GetParam("input","lidar_pc");
  619. gstroutput = xparam.GetParam("output","lidar_pointpillar");
  620. if(btrtexist == false)
  621. {
  622. std::cout<<"use onnx model."<<std::endl;
  623. pPillars = new PointPillars(
  624. 0.15,
  625. 0.10,
  626. true,
  627. pfe_file,
  628. backbone_file,
  629. pp_config
  630. );
  631. }
  632. else
  633. {
  634. std::cout<<"use trt model."<<std::endl;
  635. pPillars = new PointPillars(
  636. 0.15,
  637. 0.10,
  638. false,
  639. pfe_trt_file,
  640. backbone_trt_file,
  641. pp_config
  642. );
  643. }
  644. std::cout<<"PointPillars Init OK."<<std::endl;
  645. Eigen::AngleAxisd r_z ( 0.00654, Eigen::Vector3d ( 0,0,1 ) ); //沿 Z 轴旋转 yaw +
  646. Eigen::AngleAxisd r_y ( 0.13, Eigen::Vector3d ( 0,1,0 ) ); //沿 Y 轴旋转 roll +
  647. Eigen::AngleAxisd r_x ( -0.0377, Eigen::Vector3d ( 1,0,0 ) ); //沿 X 轴旋转 pitch -
  648. Eigen::Quaterniond q_zyx = r_z*r_y*r_x; //ZYX旋转顺序(绕旋转后的轴接着旋转)
  649. // 四元数-->>旋转矩阵
  650. rotation_matrix = q_zyx.toRotationMatrix();
  651. trans_matrix << 0, 1.1, 0.35;//x,y,z
  652. gpa = iv::modulecomm::RegisterRecv(gstrinput.data(),ListenPointCloud);
  653. gpdetect = iv::modulecomm::RegisterSend(gstroutput.data(), 10000000,1);
  654. gpthread = new std::thread(statethread);
  655. iv::ivexit::RegIVExitCall(exitfunc);
  656. return a.exec();
  657. }