mainwindow.cpp 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. #include "mainwindow.h"
  2. #include "./ui_mainwindow.h"
  3. MainWindow::MainWindow(QWidget *parent)
  4. : QMainWindow(parent)
  5. , ui(new Ui::MainWindow)
  6. {
  7. ui->setupUi(this);
  8. this->init(ETC_PATH"/velodyne_manager.prototxt");
  9. }
  10. MainWindow::~MainWindow()
  11. {
  12. /**************** 作缓存记录 ****************/
  13. velodyne::velodyneManagerParams velodyne_parameters;
  14. if (!proto_tool::read_proto_param(ETC_PATH"/velodyne_manager.prototxt", velodyne_parameters)) {
  15. std::cout << "失败" << std::endl;
  16. return;
  17. }
  18. velodyne_parameters.clear_region();
  19. for (auto &region: m_ground_region_map) {
  20. velodyne_parameters.add_region()->CopyFrom(region.second);
  21. }
  22. proto_tool::write_proto_param(ETC_PATH"/velodyne_manager.prototxt", velodyne_parameters);
  23. delete ui;
  24. }
  25. bool MainWindow::init(const std::string &filename) {
  26. velodyne::velodyneManagerParams velodyne_parameters;
  27. if (!proto_tool::read_proto_param(ETC_PATH"/velodyne_manager.prototxt", velodyne_parameters)) {
  28. std::cout << "失败" << std::endl;
  29. return false;
  30. }
  31. ui->Forward->setChecked(true);
  32. ui->EntranceComboBox->clear();
  33. m_ground_region_map.clear();
  34. for (int i = 0; i < velodyne_parameters.region_size(); ++i) {
  35. // std::cout << velodyne_parameters.region(i).region_id() << std::endl;
  36. m_ground_region_map.insert(std::pair<int, velodyne::Region>(velodyne_parameters.region(i).region_id(), velodyne_parameters.region(i)));
  37. ui->EntranceComboBox->addItem(QString::number(velodyne_parameters.region(i).region_id()));
  38. }
  39. showStatu();
  40. return true;
  41. }
  42. void MainWindow::showStatu() {
  43. QString entrance_txt = "入口id: " + ui->EntranceComboBox->currentText();
  44. QString direction;
  45. if (ui->Forward->isChecked()) {
  46. direction = "正向";
  47. }
  48. else if (ui->Reverse->isChecked()) {
  49. direction = "反向";
  50. }
  51. QString record_txt = "当前记录id: " + QString::number(record_id) + ", 最大记录id: " + QString::number(record_id_max);
  52. ui->statusbar->showMessage(entrance_txt + ", " +
  53. direction + ", " +
  54. record_txt);
  55. }
  56. void MainWindow::on_ComputeButton_clicked()
  57. {
  58. auto iter = m_ground_region_map.find(ui->EntranceComboBox->currentText().toInt());
  59. /**************** 作计算处理 ****************/
  60. double left_dis = ui->LeftFrontDIstance->value() - ui->LeftRearDistance->value();
  61. double right_dis = ui->RightFrontDistance->value() - ui->RightRearDistance->value();
  62. double angle_M = std::asin((left_dis - right_dis) * 0.5 / ui->WheelBase->value());
  63. double offset_angle = -(angle_M * 180.0 / M_PI);
  64. double front_dis = ui->LeftFrontDIstance->value() - ui->RightFrontDistance->value();
  65. // double rear_dis = ui->LeftRearDistance->value() - ui->RightRearDistance->value();
  66. double offset_x = -((front_dis) * 0.5 - (left_dis - right_dis) * 0.25) / 1000;
  67. record_id++;
  68. record_id_max = record_id;
  69. velodyne::PlcOffset offset;
  70. if (ui->Forward->isChecked()) {
  71. offset.CopyFrom(iter->second.plc_forward_offset());
  72. offset.set_plc_offsetx(iter->second.plc_forward_offset().plc_offsetx() + offset_x);
  73. offset.set_plc_offset_degree(iter->second.plc_forward_offset().plc_offset_degree() + offset_angle);
  74. iter->second.mutable_plc_forward_offset()->CopyFrom(offset);
  75. ui->textEdit->append("*" + QString::number(record_id) + "* " + ui->EntranceComboBox->currentText() + "正向 计算结果: x轴需要调整" + QString::number(offset_x, 'f', 4) + ", 角度需要调整" + QString::number(offset_angle, 'f', 4) + "度。");
  76. }
  77. else if (ui->Reverse->isChecked()) {
  78. offset.CopyFrom(iter->second.plc_reverse_offset());
  79. offset.set_plc_offsetx(iter->second.plc_reverse_offset().plc_offsetx() + offset_x);
  80. offset.set_plc_offset_degree(iter->second.plc_reverse_offset().plc_offset_degree() + offset_angle);
  81. iter->second.mutable_plc_reverse_offset()->CopyFrom(offset);
  82. ui->textEdit->append("*" + QString::number(record_id) + "* " + ui->EntranceComboBox->currentText() + "反向 计算结果: x轴需要调整" + QString::number(offset_x, 'f', 4) + ", 角度需要调整" + QString::number(offset_angle, 'f', 4) + "度。");
  83. }
  84. /**************** 计算参数清零,防止多次误计算 ****************/
  85. ui->LeftFrontDIstance->setValue(0);
  86. ui->LeftRearDistance->setValue(0);
  87. ui->RightFrontDistance->setValue(0);
  88. ui->RightRearDistance->setValue(0);
  89. /**************** 作缓存记录 ****************/
  90. velodyne::velodyneManagerParams velodyne_parameters;
  91. if (!proto_tool::read_proto_param(ETC_PATH"/velodyne_manager.prototxt", velodyne_parameters)) {
  92. std::cout << "失败" << std::endl;
  93. return;
  94. }
  95. velodyne_parameters.clear_region();
  96. for (auto &region: m_ground_region_map) {
  97. velodyne_parameters.add_region()->CopyFrom(region.second);
  98. }
  99. proto_tool::write_proto_param(ETC_PATH"/record/record_" + std::to_string(record_id) + ".prototxt", velodyne_parameters);
  100. showStatu();
  101. }
  102. void MainWindow::on_EntranceComboBox_currentTextChanged(const QString &arg1)
  103. {
  104. auto iter = m_ground_region_map.find(arg1.toInt());
  105. ui->LeftFrontDIstance->setValue(0);
  106. ui->LeftRearDistance->setValue(0);
  107. ui->RightFrontDistance->setValue(0);
  108. ui->RightRearDistance->setValue(0);
  109. if (ui->Forward->isChecked()) {
  110. ui->plc_offsetx->setText(QString::number(iter->second.plc_forward_offset().plc_offsetx(), 'f', 4));
  111. ui->plc_offsety->setText(QString::number(iter->second.plc_forward_offset().plc_offsety(), 'f', 4));
  112. ui->plc_offset_degree->setText(QString::number(iter->second.plc_forward_offset().plc_offset_degree(), 'f', 4));
  113. ui->plc_offset_wheel_base->setText(QString::number(iter->second.plc_forward_offset().plc_offset_wheel_base(), 'f', 4));
  114. }
  115. else if (ui->Reverse->isChecked()) {
  116. ui->plc_offsetx->setText(QString::number(iter->second.plc_reverse_offset().plc_offsetx(), 'f', 4));
  117. ui->plc_offsety->setText(QString::number(iter->second.plc_reverse_offset().plc_offsety(), 'f', 4));
  118. ui->plc_offset_degree->setText(QString::number(iter->second.plc_reverse_offset().plc_offset_degree(), 'f', 4));
  119. ui->plc_offset_wheel_base->setText(QString::number(iter->second.plc_reverse_offset().plc_offset_wheel_base(), 'f', 4));
  120. }
  121. showStatu();
  122. }
  123. void MainWindow::on_Forward_clicked()
  124. {
  125. on_EntranceComboBox_currentTextChanged(ui->EntranceComboBox->currentText());
  126. }
  127. void MainWindow::on_Reverse_clicked()
  128. {
  129. on_EntranceComboBox_currentTextChanged(ui->EntranceComboBox->currentText());
  130. }
  131. void MainWindow::on_RedoButton_clicked()
  132. {
  133. record_id++;
  134. if (record_id <= record_id_max && record_id >= 0) {
  135. init(ETC_PATH"/record/record_" + std::to_string(record_id) + ".prototxt");
  136. } else {
  137. record_id = record_id_max;
  138. }
  139. }
  140. void MainWindow::on_QuashButton_clicked()
  141. {
  142. record_id--;
  143. if (record_id <= record_id_max && record_id >= 0) {
  144. init(ETC_PATH"/record/record_" + std::to_string(record_id) + ".prototxt");
  145. } else {
  146. record_id = 0;
  147. }
  148. }