navigation_main.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. //
  2. // Created by zx on 23-5-8.
  3. //
  4. #include "navigation_main.h"
  5. NavigationMain::NavigationMain(){
  6. move_mode_=Monitor_emqx::eSingle;
  7. wheelBase_=0;
  8. }
  9. NavigationMain::~NavigationMain(){
  10. }
  11. void NavigationMain::ResetPose(const Pose2d& pose){
  12. if(move_mode_==Monitor_emqx::eMain) {
  13. Pose2d transform(-wheelBase_/2.0,0,0);
  14. Navigation::ResetPose(pose * transform);
  15. }
  16. else
  17. Navigation::ResetPose(pose);
  18. }
  19. void NavigationMain::publish_statu(NavMessage::NavStatu& statu)
  20. {
  21. statu.set_main_agv(true);
  22. Navigation::publish_statu(statu);
  23. }
  24. void NavigationMain::HandleNavCmd(const NavMessage::NavCmd& cmd)
  25. {
  26. if(cmd.action()==4)
  27. {
  28. if(cmd.wheelbase()<2.4 || cmd.wheelbase()>3.5)
  29. {
  30. printf("Failed to Switch MoveMode --> main,wheelbase invalid :%f\n",cmd.wheelbase());
  31. return;
  32. }
  33. printf(" Switch MoveMode --> main\n");
  34. SwitchMode(Monitor_emqx::eMain,cmd.wheelbase());
  35. return ;
  36. }
  37. if(cmd.action()==5)
  38. {
  39. printf(" Switch MoveMode --> single\n");
  40. SwitchMode(Monitor_emqx::eSingle,0);
  41. return ;
  42. }
  43. else
  44. {
  45. Navigation::HandleNavCmd(cmd);
  46. }
  47. }
  48. bool NavigationMain::Start(const NavMessage::NavCmd& cmd)
  49. {
  50. /*if(move_mode_!=Monitor_emqx::eMain)
  51. {
  52. printf(" navigation mode must set main,parameter:Pose2d\n");
  53. return false;
  54. }*/
  55. return Navigation::Start(cmd);
  56. }
  57. void NavigationMain::SendMoveCmd(Monitor_emqx::ActionMode mode,Monitor_emqx::ActionType type,
  58. double v,double angular)
  59. {
  60. if(monitor_)
  61. {
  62. monitor_->set_speed(mode,type,v,angular,wheelBase_);
  63. }
  64. }
  65. NavMessage::RobotStatu NavigationMain::CreateRobotStatuMsg()
  66. {
  67. NavMessage::RobotStatu agvStatu=Navigation::CreateRobotStatuMsg();
  68. agvStatu.mutable_agvstatu()->set_clamp_other(timed_other_clamp_.Get());
  69. //std::cout<<agvStatu.DebugString()<<std::endl;
  70. return agvStatu;
  71. }
  72. void NavigationMain::ResetOtherClamp(ClampStatu statu)
  73. {
  74. timed_other_clamp_.reset(statu,1);
  75. }
  76. void NavigationMain::HandleAgvStatu(const MqttMsg& msg)
  77. {
  78. NavMessage::AgvStatu speed;
  79. if(msg.toProtoMessage(speed))
  80. {
  81. ResetStatu(speed.v(),speed.w());
  82. ResetClamp((ClampStatu)speed.clamp());
  83. ResetOtherClamp((ClampStatu)speed.clamp_other());
  84. //printf(" clamp:%d other:%d\n",speed.clamp(),speed.clamp_other());
  85. }
  86. }
  87. bool NavigationMain::clamp_close()
  88. {
  89. if(move_mode_==Monitor_emqx::eSingle)
  90. return Navigation::clamp_close();
  91. printf("双车夹持\n");
  92. if(monitor_) {
  93. monitor_->clamp_close(move_mode_);
  94. while (exit_ == false) {
  95. if (timed_clamp_.timeout() || timed_other_clamp_.timeout()) {
  96. printf("timed clamp is timeout\n");
  97. return false;
  98. }
  99. if (timed_clamp_.Get() == eClosed && timed_other_clamp_.Get()==eClosed) {
  100. printf("双车夹持completed!!!\n");
  101. return true;
  102. }
  103. std::this_thread::sleep_for(std::chrono::milliseconds(100));
  104. monitor_->clamp_close(move_mode_);
  105. }
  106. return false;
  107. }
  108. return false;
  109. }
  110. bool NavigationMain::clamp_open() {
  111. if(move_mode_==Monitor_emqx::eSingle)
  112. return Navigation::clamp_open();
  113. if(monitor_) {
  114. printf("双车松夹持\n");
  115. monitor_->clamp_open(move_mode_);
  116. while(exit_==false)
  117. {
  118. if(timed_clamp_.timeout()||timed_other_clamp_.timeout())
  119. {
  120. printf("timed clamp is timeout\n");
  121. return false;
  122. }
  123. if(timed_clamp_.Get()==eOpened&&timed_other_clamp_.Get()==eOpened) {
  124. printf("双车松夹持completed!!!\n");
  125. return true;
  126. }
  127. std::this_thread::sleep_for(std::chrono::milliseconds(100));
  128. monitor_->clamp_open(move_mode_);
  129. }
  130. return false;
  131. }
  132. return false;
  133. }