navigation_main.cpp 3.9 KB

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