mainwindow.cpp 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <QPaintEvent>
  4. #include <QPainter>
  5. #include <iostream>
  6. #include <math.h>
  7. #include <algorithm>
  8. MainWindow * mw;
  9. #define APOLLO_FU //宏开关,undef重新编译则恢复原来状态
  10. void ListenFusion(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
  11. {
  12. if(nSize<1) return;
  13. iv::fusion::fusionobjectarray xfusionobjarray;
  14. if(false == xfusionobjarray.ParseFromArray(strdata,nSize))
  15. {
  16. std::cout<<"DRG Listen fusion fail."<<std::endl;
  17. return;
  18. }
  19. std::cout << "DRG Listen fusion: " << xfusionobjarray.ByteSize() << " bytes" << std::endl;
  20. mw->generateDRG(xfusionobjarray);
  21. mw->updateDRG();
  22. }
  23. void ListenGPSFusion(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
  24. {
  25. if(nSize<1) return;
  26. iv::fusion::gpsndt gpsdata;
  27. if(false == gpsdata.ParseFromArray(strdata,nSize))
  28. {
  29. std::cout<<"DRG Listen GPSfusion fail."<<std::endl;
  30. return;
  31. }
  32. std::cout << "DRG Listen GPSfusion: " << gpsdata.ByteSize() << " bytes" << std::endl;
  33. }
  34. MainWindow::MainWindow(QWidget *parent) :
  35. QMainWindow(parent),
  36. ui(new Ui::MainWindow)
  37. {
  38. ui->setupUi(this);
  39. mw = this;
  40. //监听融合信息
  41. iv::modulecomm::RegisterRecv("fusion",ListenFusion);
  42. iv::modulecomm::RegisterRecv("gpsndtfusion",ListenGPSFusion);
  43. //发送珊格图的结果
  44. drgFusion = iv::modulecomm::RegisterSend("drgfusion",160000*30,3);
  45. pa = iv::modulecomm::RegisterSend("drg_image",160000*30,3);
  46. QTimer * timer = new QTimer(this);
  47. connect(timer,SIGNAL(timeout()),this,SLOT(onTimer()));
  48. timer->start(1000); //1秒(1000毫秒)更新一次
  49. setWindowTitle("栅格图生成");
  50. QObject::connect(ui->checkBox,SIGNAL(stateChanged(int)),this,SLOT(on_checkBox_stateChanged));
  51. }
  52. MainWindow::~MainWindow()
  53. {
  54. delete ui;
  55. }
  56. void MainWindow::onTimer()
  57. {
  58. //updateDRG();
  59. return;
  60. }
  61. void MainWindow::updateDRG()
  62. {
  63. if(isPreview) drawImage();
  64. }
  65. void MainWindow::generateDRG(iv::fusion::fusionobjectarray &arr){
  66. ui->msg->setText("收到 " + QString::number(arr.obj_size()) + " 个障碍物信息");
  67. int picSize = 160000;
  68. drg.clear_pixels();
  69. int marks[picSize] = {0};
  70. for(int i=0; i<arr.obj_size(); i++){
  71. //处理融合数据,分析每个障碍物特点
  72. iv::fusion::fusionobject obj = arr.obj(i);
  73. iv::fusion::PointXYZ center = obj.centroid();//中心点
  74. iv::fusion::Dimension space = obj.dimensions();//尺寸
  75. //每个障碍物占据一片像素点
  76. //先确定左上角和右下角
  77. int leftTopX = std::max(std::min( (int)( (center.x() - space.x()/2)*10 ) + 100, 199),0);
  78. int leftTopY = std::max(std::min( 400 - (int)((center.y() + space.y()/2)*10), 799),0);
  79. int rightBottomX = std::max(std::min( (int)( (center.x() + space.x()/2)*10 ) + 100, 199),0);
  80. int rightBottomY = std::max(std::min( 400 - (int)((center.y() - space.y()/2)*10), 799),0);
  81. //换算成数组下标,然后设置值
  82. for(int j=leftTopY; j<=rightBottomY; j++){
  83. int base = j*200;
  84. for(int k=leftTopX; k<=rightBottomX; k++){
  85. int index = base + k;
  86. if(index < picSize){
  87. marks[index] = i+1;
  88. }
  89. }
  90. }
  91. }
  92. for(int i=0; i<picSize; i++){
  93. iv::fusion::DRGPix *p = drg.add_pixels();
  94. if(marks[i]>0){
  95. iv::fusion::fusionobject obj = arr.obj(marks[i]-1);
  96. //高度取z向空间
  97. if(obj.has_dimensions() && obj.dimensions().has_z()) p->set_height(obj.dimensions().z());
  98. if(obj.has_id()) p->set_id(obj.id());
  99. if(obj.has_type()) p->set_type(obj.type());
  100. if(obj.has_type_name()) p->set_type_name(obj.type_name());
  101. if(obj.has_prob()) p->set_prob(obj.prob());
  102. if(obj.has_vel_abs()){
  103. iv::fusion::VelXY * vel = new iv::fusion::VelXY(obj.vel_abs());
  104. p->set_allocated_vel_abs(vel);
  105. //动态障碍物置0
  106. if(vel->has_x()&&vel->has_y()&&(vel->x()*vel->x()+vel->y()*vel->y())>0.01){
  107. p->set_value(0);
  108. }else{
  109. p->set_value(1);
  110. }
  111. }else{
  112. p->set_value(1);
  113. }
  114. if(obj.has_vel_relative()) p->set_allocated_vel_relative(new iv::fusion::VelXY(obj.vel_relative()));
  115. if(obj.has_yaw()) p->set_yaw(obj.yaw());
  116. //评估危险程度,todo
  117. p->set_risklevel(0);
  118. }else{
  119. p->set_value(0);
  120. p->set_height(0);
  121. p->set_risklevel(0);
  122. }
  123. }
  124. //写入共享内存处理结果
  125. int nsize = drg.ByteSize();
  126. char * str = new char[nsize];
  127. ui->result->setText("发送结果:" + QString::number(nsize) + "字节");
  128. if(drg.SerializeToArray(str,nsize)){
  129. iv::modulecomm::ModuleSendMsg(drgFusion,str,nsize);
  130. }
  131. delete str;
  132. }
  133. void MainWindow::drawImage()
  134. {
  135. QImage image(QSize(200,800),QImage::Format_ARGB32);
  136. image.fill("white");
  137. QPainter painter(&image);
  138. painter.save();
  139. painter.setRenderHint(QPainter::Antialiasing); //线条抗锯齿
  140. painter.setRenderHint(QPainter::TextAntialiasing);
  141. painter.save();
  142. QBrush brush;
  143. brush.setColor(Qt::black);
  144. brush.setStyle(Qt::SolidPattern);
  145. painter.setBrush(brush);
  146. int psize = drg.pixels_size();
  147. if(psize>1){
  148. for(int i=0; i<psize; i++){
  149. if(drg.pixels(i).value()>0){
  150. //计算点的位置
  151. int x = i%200, y = i/200;
  152. painter.drawPoint(x,y); //即widget窗口的整个矩形,大于定义的辐射填充区域有延展效果
  153. }
  154. }
  155. }
  156. painter.restore();
  157. painter.end();
  158. ui->imageLabel->setPixmap(QPixmap::fromImage(image));
  159. }
  160. void MainWindow::clearImage(){
  161. QImage image(QSize(200,800),QImage::Format_ARGB32);
  162. image.fill("gray");
  163. #ifdef APOLLO_FU
  164. //image.fill("white");
  165. QPainter painter(&image);
  166. painter.setRenderHint(QPainter::Antialiasing); //线条抗锯齿
  167. painter.setRenderHint(QPainter::TextAntialiasing);
  168. //painter.setPen(QColor(0, 160, 230));
  169. painter.setPen(QColor(0, 250, 0)); //RGB配色表 http://www.wahart.com.hk/rgb.htm
  170. for(int i=0;i<=80;i++){
  171. painter.drawLine(0,i*10,200,i*10);
  172. }
  173. for(int i=0;i<=20;i++){
  174. painter.drawLine(i*10,0,i*10,800);
  175. }
  176. #endif
  177. #ifdef APOLLO_FU
  178. int nsize = image.byteCount();
  179. unsigned char *data = image.bits();
  180. iv::modulecomm::ModuleSendMsg(pa,(const char*)data,nsize);
  181. #endif
  182. ui->imageLabel->setPixmap(QPixmap::fromImage(image));
  183. }
  184. void MainWindow::resizeEvent(QResizeEvent* size){
  185. //计算显示控件的尺寸
  186. int w = this->width()*0.9, h = this->height() - 20;
  187. if(h>w*4){
  188. h = w*4;
  189. }else{
  190. w = h/4;
  191. }
  192. ui->imageLabel->setGeometry((this->width() - w)/2,15,w,h);
  193. ui->checkBox->setGeometry(this->width()-100,10,100,15);
  194. }
  195. void MainWindow::on_checkBox_stateChanged(int arg1)
  196. {
  197. if(arg1){
  198. isPreview = true;
  199. }else{
  200. clearImage();
  201. isPreview = false;
  202. }
  203. }