vehicle_control.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. #include "vehicle_control.h"
  2. #include <math.h>
  3. #include "modulecomm.h"
  4. #include "remotectrl.pb.h"
  5. extern std::string gstrserverip;
  6. extern std::string gstrcontrolPort;
  7. extern std::string gstrcontrolInterval;
  8. extern std::string gstruploadMapInterval;
  9. extern std::string gstrid;
  10. extern std::string gstrplateNumber;
  11. extern char stryamlpath[256];
  12. extern uint8_t gCtrlMode_Status; //0 auto 1 remote 2 stop 3 platform
  13. using org::jeecg::defsControl::grpc::Empty; ///< other message
  14. using org::jeecg::defsControl::grpc::GPSPoint;
  15. using org::jeecg::defsControl::grpc::MapPoint;
  16. using org::jeecg::defsControl::grpc::CtrlMode; ///< other enum
  17. using org::jeecg::defsControl::grpc::ShiftStatus;
  18. VehicleControlClient::VehicleControlClient(std::shared_ptr<Channel> channel)
  19. {
  20. stub_ = VehicleControl::NewStub(channel);
  21. dec_yaml(stryamlpath);
  22. shmRemoteCtrl.mpa = iv::modulecomm::RegisterSend(shmRemoteCtrl.mstrmsgname,shmRemoteCtrl.mnBufferSize,shmRemoteCtrl.mnBufferCount);
  23. }
  24. VehicleControlClient::~VehicleControlClient(void)
  25. {
  26. if(shmRemoteCtrl.mpa != nullptr)iv::modulecomm::Unregister(shmRemoteCtrl.mpa);
  27. requestInterruption();
  28. while(this->isFinished() == false);
  29. }
  30. void VehicleControlClient::dec_yaml(const char *stryamlpath)
  31. {
  32. YAML::Node config;
  33. try
  34. {
  35. config = YAML::LoadFile(stryamlpath);
  36. }
  37. catch(YAML::BadFile &e)
  38. {
  39. std::cout<<e.what()<<std::endl;
  40. std::cout<<"yaml file load fail."<<std::endl;
  41. return;
  42. }
  43. catch(YAML::ParserException &e)
  44. {
  45. std::cout<<e.what()<<std::endl;
  46. std::cout<<"yaml file is malformed."<<std::endl;
  47. return;
  48. }
  49. std::string strmsgname;
  50. if(config["remote_ctrl"])
  51. {
  52. if(config["remote_ctrl"]["msgname"]&&config["remote_ctrl"]["buffersize"]&&config["remote_ctrl"]["buffercount"])
  53. {
  54. strmsgname = config["remote_ctrl"]["msgname"].as<std::string>();
  55. strncpy(shmRemoteCtrl.mstrmsgname,strmsgname.data(),255);
  56. shmRemoteCtrl.mnBufferSize = config["remote_ctrl"]["buffersize"].as<int>();
  57. shmRemoteCtrl.mnBufferCount = config["remote_ctrl"]["buffercount"].as<int>();
  58. std::cout << "RemoteCtrl:" << shmRemoteCtrl.mstrmsgname << "," << shmRemoteCtrl.mnBufferSize << "," << shmRemoteCtrl.mnBufferCount << std::endl;
  59. }
  60. }
  61. else
  62. {
  63. strmsgname = "remotectrl";
  64. strncpy(shmRemoteCtrl.mstrmsgname,strmsgname.data(),255);
  65. shmRemoteCtrl.mnBufferSize = 10000;
  66. shmRemoteCtrl.mnBufferCount = 1;
  67. }
  68. return;
  69. }
  70. std::string VehicleControlClient::vehicleControl(void)
  71. {
  72. // Data we are sending to the server.
  73. Empty request;
  74. request.set_id(gstrid);
  75. // Container for the data we expect from the server.
  76. ControlReply reply;
  77. // Context for the client. It could be used to convey extra information to
  78. // the server and/or tweak certain RPC behaviors.
  79. ClientContext context;
  80. gpr_timespec timespec;
  81. timespec.tv_sec = 1;
  82. timespec.tv_nsec = 0;
  83. timespec.clock_type = GPR_TIMESPAN;
  84. context.set_deadline(timespec);
  85. // The actual RPC.
  86. Status status = stub_ -> vehicleControl(&context,request,&reply);
  87. // Act upon its status.
  88. if (status.ok()) {
  89. if(reply.id() == gstrid)
  90. {
  91. shiftCMD = reply.shiftcmd();
  92. steeringWheelAngleCMD = reply.steeringwheelanglecmd();
  93. throttleCMD = reply.throttlecmd();
  94. brakeCMD = reply.brakecmd();
  95. }
  96. else
  97. {
  98. // std::cout<<"id:"<<reply.id()<<std::endl;
  99. // if(throttleCMD > 0)throttleCMD -= 1.5;
  100. // if(throttleCMD <= 0)throttleCMD = 0;
  101. // if(brakeCMD > 0)brakeCMD -= 1.5;
  102. // if(brakeCMD <= 0)brakeCMD = 0;
  103. }
  104. return "vehicleControl RPC successed";
  105. } else {
  106. std::cout << status.error_code() << ": " << status.error_message()
  107. << std::endl;
  108. if(status.error_code() == 4)
  109. {
  110. std::cout << "vehicleControl RPC connect timeout" << std::endl;
  111. }
  112. shiftCMD = ShiftStatus::SHIFT_DRIVE;
  113. steeringWheelAngleCMD = 0.0;
  114. throttleCMD = 0.0;
  115. brakeCMD = 100.0;
  116. return "vehicleControl RPC failed";
  117. }
  118. }
  119. void VehicleControlClient::updateControlData(void)
  120. {
  121. #if 0
  122. std::cout<<"shift:"<<shiftCMD<<std::endl;
  123. std::cout<<"steeringWheelAngle:"<<steeringWheelAngleCMD<<std::endl;
  124. std::cout<<"throttle:"<<throttleCMD<<std::endl;
  125. std::cout<<"brake:"<<brakeCMD<<std::endl;
  126. #endif
  127. // std::cout<<"\n"<<"shift:"<<shiftCMD<<std::endl;
  128. // std::cout<<"steeringWheelAngle:"<<steeringWheelAngleCMD<<std::endl;
  129. // std::cout<<"throttle:"<<throttleCMD<<std::endl;
  130. // std::cout<<"brake:"<<brakeCMD<<"\n"<<std::endl;
  131. iv::remotectrl xmsg;
  132. if(modeCMD == CtrlMode::CMD_REMOTE || modeCMD == CtrlMode::CMD_CLOUD_PLATFORM)
  133. xmsg.set_ntype(iv::remotectrl::CtrlType::remotectrl_CtrlType_REMOTE);
  134. else if(modeCMD == CtrlMode::CMD_AUTO)
  135. xmsg.set_ntype(iv::remotectrl::CtrlType::remotectrl_CtrlType_AUTO);
  136. else if(modeCMD == CtrlMode::CMD_EMERGENCY_STOP)
  137. xmsg.set_ntype(iv::remotectrl::CtrlType::remotectrl_CtrlType_STOP);
  138. if(modeCMD == CtrlMode::CMD_REMOTE || modeCMD == CtrlMode::CMD_CLOUD_PLATFORM)
  139. {
  140. xmsg.set_acc(throttleCMD);
  141. xmsg.set_brake(brakeCMD);
  142. xmsg.set_wheel((-1)*steeringWheelAngleCMD/5.5f);
  143. if(shiftCMD == org::jeecg::defsControl::grpc::ShiftStatus::SHIFT_DRIVE)
  144. xmsg.set_shift(1);
  145. else if(shiftCMD == org::jeecg::defsControl::grpc::ShiftStatus::SHIFT_REVERSE)
  146. xmsg.set_shift(-1);
  147. else
  148. xmsg.set_shift(0);
  149. }
  150. else if(modeCMD == CtrlMode::CMD_AUTO)
  151. {
  152. xmsg.set_acc(0.0);
  153. xmsg.set_brake(0.0);
  154. xmsg.set_wheel(0.0);
  155. xmsg.set_shift(0); //real shift decided by controller
  156. }
  157. else // CMD_STOP
  158. {
  159. xmsg.set_acc(0.0);
  160. xmsg.set_brake(100.0);
  161. xmsg.set_wheel(0.0);
  162. xmsg.set_shift(0); //real shift decided by controller
  163. }
  164. int ndatasize = xmsg.ByteSize();
  165. char * str = new char[ndatasize];
  166. std::shared_ptr<char> pstr;pstr.reset(str);
  167. if(!xmsg.SerializeToArray(str,ndatasize))
  168. {
  169. std::cout<<"updateControlData serialize error."<<std::endl;
  170. return;
  171. }
  172. iv::modulecomm::ModuleSendMsg(shmRemoteCtrl.mpa,str,ndatasize);
  173. }
  174. void VehicleControlClient::run()
  175. {
  176. QTime xTime;
  177. xTime.start();
  178. int lastTime = xTime.elapsed();
  179. uint64_t interval = std::atoi(gstrcontrolInterval.c_str());
  180. while (!QThread::isInterruptionRequested())
  181. {
  182. if(abs(xTime.elapsed() - lastTime)>=interval)
  183. {
  184. std::string reply = vehicleControl();
  185. // std::cout<< reply <<std::endl;
  186. updateControlData();
  187. lastTime = xTime.elapsed();
  188. }
  189. }
  190. }
  191. void VehicleControlClient::ctrlMode_Changed_Slot(org::jeecg::defsControl::grpc::CtrlMode ctrlMode)
  192. {
  193. modeCMD = ctrlMode;
  194. }
  195. VehicleChangeCtrlModeClient::VehicleChangeCtrlModeClient(std::shared_ptr<Channel> channel)
  196. {
  197. stub_ = VehicleControl::NewStub(channel);
  198. }
  199. VehicleChangeCtrlModeClient::~VehicleChangeCtrlModeClient(void)
  200. {
  201. requestInterruption();
  202. while(this->isFinished() == false);
  203. }
  204. std::string VehicleChangeCtrlModeClient::changeCtrlMode(void)
  205. {
  206. // Data we are sending to the server.
  207. Empty request;
  208. request.set_id(gstrid);
  209. // Container for the data we expect from the server.
  210. CtrlModeReply reply;
  211. // Context for the client. It could be used to convey extra information to
  212. // the server and/or tweastd::cout<<"shift:"<<shiftCMD<<std::endl;k certain RPC behaviors.
  213. ClientContext context;
  214. gpr_timespec timespec;
  215. timespec.tv_sec = 1;
  216. timespec.tv_nsec = 0;
  217. timespec.clock_type = GPR_TIMESPAN;
  218. context.set_deadline(timespec);
  219. // The actual RPC.
  220. Status status = stub_ -> changeCtrlMode(&context,request,&reply);
  221. // Act upon its status.
  222. if (status.ok()) {
  223. if(reply.id() == gstrid)
  224. {
  225. modeCMD = reply.modecmd();
  226. }
  227. return "changeCtrlMode RPC successed";
  228. } else {
  229. std::cout << status.error_code() << ": " << status.error_message()
  230. << std::endl;
  231. if(status.error_code() == 4)
  232. {
  233. std::cout << "vehicleControl RPC connect timeout" << std::endl;
  234. }
  235. modeCMD = CtrlMode::CMD_EMERGENCY_STOP;
  236. return "changeCtrlMode RPC failed";
  237. }
  238. }
  239. void VehicleChangeCtrlModeClient::updateCtrolMode(void)
  240. {
  241. // std::cout<<"modeCMD:"<<modeCMD<<std::endl;
  242. gCtrlMode_Status = modeCMD;
  243. emit ctrlMode_Changed(modeCMD);
  244. }
  245. void VehicleChangeCtrlModeClient::run()
  246. {
  247. QTime xTime;
  248. xTime.start();
  249. int lastTime = xTime.elapsed();
  250. uint64_t interval = std::atoi(gstrcontrolInterval.c_str()) + 5; // move 5 ms to avoid ctrl data request
  251. while (!QThread::isInterruptionRequested())
  252. {
  253. if(abs(xTime.elapsed() - lastTime)>=interval)
  254. {
  255. std::string reply = changeCtrlMode();
  256. // std::cout<< reply <<std::endl;
  257. updateCtrolMode();
  258. lastTime = xTime.elapsed();
  259. }
  260. }
  261. }
  262. VehicleUploadMapClient::VehicleUploadMapClient(std::shared_ptr<Channel> channel)
  263. {
  264. stub_ = VehicleControl::NewStub(channel);
  265. }
  266. VehicleUploadMapClient::~VehicleUploadMapClient(void)
  267. {
  268. requestInterruption();
  269. while(this->isFinished() == false);
  270. }
  271. std::string VehicleUploadMapClient::uploadMap(void)
  272. {
  273. // Data we are sending to the server.
  274. Empty request;
  275. request.set_id(gstrid);
  276. // Container for the data we expect from the server.
  277. UploadMapReply reply;
  278. // Context for the client. It could be used to convey extra information to
  279. // the server and/or tweak certain RPC behaviors.
  280. ClientContext context;
  281. gpr_timespec timespec;
  282. timespec.tv_sec = 2;
  283. timespec.tv_nsec = 0;
  284. timespec.clock_type = GPR_TIMESPAN;
  285. context.set_deadline(timespec);
  286. // The actual RPC.
  287. Status status = stub_ -> UploadMap(&context,request,&reply);
  288. // Act upon its status.
  289. if (status.ok()) {
  290. if(reply.id() == gstrid)
  291. {
  292. // std::cout<<reply.id()<<std::endl;
  293. isNeedMap = false;
  294. patrolPathID = "noPath";
  295. POIPoints.clear();
  296. isNeedMap = reply.isneedmap();
  297. // std::cout<<reply.isneedmap()<<std::endl;
  298. patrolPathID = reply.patrolpathid();
  299. // std::cout<<reply.patrolpathid()<<std::endl;
  300. for(int i = 0;i < reply.mappoints_size();i++)
  301. {
  302. POIPoints.append(reply.mappoints(i));
  303. // std::cout<<reply.mappoints(i).index()<<std::endl;
  304. }
  305. }
  306. return "UploadMap RPC successed";
  307. } else {
  308. std::cout << status.error_code() << ": " << status.error_message()
  309. << std::endl;
  310. if(status.error_code() == 4)
  311. {
  312. std::cout << "vehicleControl RPC connect timeout" << std::endl;
  313. }
  314. return "UploadMap RPC failed";
  315. }
  316. }
  317. void VehicleUploadMapClient::updateMapPOIData(void)
  318. {
  319. std::cout<<"isNeedMap:"<<isNeedMap<<std::endl;
  320. std::cout<<"patrolPathID:"<<patrolPathID<<std::endl;
  321. emit patrolPOI_Recieved(patrolPathID);
  322. }
  323. void VehicleUploadMapClient::run()
  324. {
  325. QTime xTime;
  326. xTime.start();
  327. int lastTime = xTime.elapsed();
  328. uint64_t interval = std::atoi(gstruploadMapInterval.c_str());
  329. while (!QThread::isInterruptionRequested())
  330. {
  331. if(abs(xTime.elapsed() - lastTime)>=interval)
  332. {
  333. if(isNeedMap == false)
  334. {
  335. std::string reply = uploadMap();
  336. // std::cout<< reply <<std::endl;
  337. if(isNeedMap == true)
  338. {
  339. updateMapPOIData();
  340. }
  341. }
  342. lastTime = xTime.elapsed();
  343. }
  344. }
  345. }
  346. void VehicleUploadMapClient::uploadPath_Finished_Slot(std::string pathID)
  347. {
  348. std::cout<<"Path ID:"<<pathID<<" upload finished"<<std::endl;
  349. if(isNeedMap == true)
  350. {
  351. isNeedMap = false;
  352. }
  353. }