main.cpp 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. //
  2. // Created by zx on 2019/12/28.
  3. //
  4. #include <fcntl.h>
  5. #include <iostream>
  6. #include "plc/plc_communicator.h"
  7. //#include "laser/Laser.h"
  8. #include "plc/plc_communicator.h"
  9. #include "tool/pathcreator.h"
  10. #include <glog/logging.h>
  11. #include "verifier.h"
  12. #include "proto_tool.h"
  13. #include <livox_sdk.h>
  14. #include "LivoxMid70.h"
  15. using google::protobuf::io::FileInputStream;
  16. using google::protobuf::io::FileOutputStream;
  17. using google::protobuf::io::ZeroCopyInputStream;
  18. using google::protobuf::io::CodedInputStream;
  19. using google::protobuf::io::ZeroCopyOutputStream;
  20. using google::protobuf::io::CodedOutputStream;
  21. using google::protobuf::Message;
  22. #include "setting.pb.h"
  23. #include "safety_excutor.h"
  24. GOOGLE_GLOG_DLL_DECL void shut_down_logging(const char* data, int size)
  25. {
  26. time_t tt;
  27. time( &tt );
  28. tt = tt + 8*3600; // transform the time zone
  29. tm* t= gmtime( &tt );
  30. char buf[255]={0};
  31. sprintf(buf,"./%d%02d%02d-%02d%02d%02d-dump.txt",
  32. t->tm_year + 1900,
  33. t->tm_mon + 1,
  34. t->tm_mday,
  35. t->tm_hour,
  36. t->tm_min,
  37. t->tm_sec);
  38. FILE* tp_file=fopen(buf,"w");
  39. fprintf(tp_file,data,strlen(data));
  40. fclose(tp_file);
  41. }
  42. void init_glog()
  43. {
  44. time_t tt = time(0);//时间cuo
  45. struct tm* t = localtime(&tt);
  46. char strYear[255]={0};
  47. char strMonth[255]={0};
  48. char strDay[255]={0};
  49. sprintf(strYear,"%04d", t->tm_year+1900);
  50. sprintf(strMonth,"%02d", t->tm_mon+1);
  51. sprintf(strDay,"%02d", t->tm_mday);
  52. char buf[255]={0};
  53. getcwd(buf,255);
  54. char strdir[255]={0};
  55. sprintf(strdir,"%s/log/%s/%s/%s", buf,strYear,strMonth,strDay);
  56. PathCreator creator;
  57. creator.Mkdir(strdir);
  58. char logPath[255] = { 0 };
  59. sprintf(logPath, "%s/", strdir);
  60. FLAGS_max_log_size = 100;
  61. FLAGS_logbufsecs = 0;
  62. google::InitGoogleLogging("shutter_verify");
  63. google::SetStderrLogging(google::INFO);
  64. google::SetLogDestination(0, logPath);
  65. google::SetLogFilenameExtension("zxlog");
  66. google::InstallFailureSignalHandler();
  67. google::InstallFailureWriter(&shut_down_logging);
  68. FLAGS_colorlogtostderr = true; // Set log color
  69. FLAGS_logbufsecs = 0; // Set log output speed(s)
  70. FLAGS_max_log_size = 1024; // Set max log file size(GB)
  71. FLAGS_stop_logging_if_full_disk = true;
  72. }
  73. std::mutex mut;
  74. pcl::visualization::PCLVisualizer viewer("Cloud");
  75. //读取protobuf 配置文件
  76. //file:文件
  77. //parameter:要读取的配置
  78. bool read_proto_param(std::string file, ::google::protobuf::Message& parameter)
  79. {
  80. int fd = open(file.c_str(), O_RDONLY);
  81. if (fd == -1) return false;
  82. FileInputStream* input = new FileInputStream(fd);
  83. bool success = google::protobuf::TextFormat::Parse(input, &parameter);
  84. delete input;
  85. close(fd);
  86. return success;
  87. }
  88. int Working()
  89. {
  90. while(1)
  91. {
  92. break;
  93. }
  94. /*Error_manager code;
  95. Eigen::Vector4f plane,plane1;
  96. plane[0]=0;
  97. plane[1]=1;
  98. plane[2]=0.2;
  99. plane[3]=2;
  100. plane1[0]=0;
  101. plane1[1]=1;
  102. plane1[2]=-0.2;
  103. plane1[3]=-1.3;
  104. float maxd=0.02,mind=-0.08,maxd1=-0.02,mind1=-0.12;
  105. shuttler_verifier left_shutter;
  106. shuttler_verifier right_shutter;
  107. left_shutter.set_condition(plane1,maxd1,mind1);
  108. right_shutter.set_condition(plane,maxd,mind);
  109. verifier shutter(left_shutter,right_shutter);
  110. mut.lock();
  111. left_shutter.create_plane(viewer);
  112. right_shutter.create_plane(viewer);
  113. mut.unlock();
  114. //创建雷达 循环采集
  115. //读laser配置
  116. Laser_proto::Laser_parameter_all laser_parameters;
  117. if(!proto_tool::read_proto_param("./setting/laser.prototxt",laser_parameters))
  118. {
  119. LOG(ERROR)<<"read laser parameter failed";
  120. return -1;
  121. }
  122. int laser_cout=laser_parameters.laser_parameters_size();
  123. if(laser_cout==0)
  124. {
  125. LOG(ERROR)<<" no lidars ";
  126. return 0;
  127. }
  128. std::vector<Laser_base*> plasers;
  129. plasers.resize(laser_cout);
  130. for(int i=0;i<laser_parameters.laser_parameters_size();++i)
  131. {
  132. plasers[i] = LaserRegistory::CreateLaser(laser_parameters.laser_parameters(i).type(), i,
  133. laser_parameters.laser_parameters(i));
  134. if (plasers[i] != NULL)
  135. {
  136. if (plasers[i]->connect_laser() != SUCCESS)
  137. {
  138. char description[255] = {0};
  139. sprintf(description, "Laser %d connect failed...", i);
  140. LOG(ERROR)<<description;
  141. }
  142. }
  143. }
  144. for (int i = 0; i < laser_parameters.laser_parameters_size(); ++i)
  145. {
  146. std::string type = laser_parameters.laser_parameters(i).type();
  147. if (type.find("Livox") != type.npos ||type.find("Horizon") != type.npos)
  148. {
  149. if (Start() == false)
  150. {
  151. Uninit();
  152. LOG(ERROR)<<"Livox laser init failed...";
  153. return -2;
  154. }
  155. break;
  156. }
  157. }
  158. usleep(3000*1000);
  159. LOG(INFO)<<"init ok...";
  160. //采集
  161. int frames=0;
  162. while(1)
  163. {
  164. auto t_start_point = std::chrono::system_clock::now();
  165. pcl::PointCloud<pcl::PointXYZ> scan_cloud;
  166. std::mutex cloud_lock;
  167. std::vector<Laser_task *> laser_task_vector;
  168. for (int i = 0; i < plasers.size(); ++i)
  169. {
  170. int frame_count = laser_parameters.laser_parameters(i).frame_num();
  171. if (plasers[i] != nullptr)
  172. {
  173. //创建扫描任务,
  174. Laser_task *laser_task = new Laser_task();
  175. //
  176. laser_task->task_init(TASK_CREATED, &scan_cloud, &cloud_lock);
  177. laser_task->set_task_frame_maxnum(frame_count);
  178. laser_task_vector.push_back(laser_task);
  179. //发送任务单给雷达
  180. code = plasers[i]->execute_task(laser_task);
  181. if (code != SUCCESS)
  182. {
  183. LOG(ERROR) << " capture failed :" << code.get_error_description();
  184. return -3;
  185. }
  186. }
  187. }
  188. //等待雷达完成任务单
  189. double second=0.0;
  190. while (1)
  191. {
  192. //判断是否强制退出
  193. //判断雷达任务单是否全部完成
  194. bool tb_laser_complete = true;
  195. for (int i = 0; i < laser_task_vector.size(); ++i)
  196. {
  197. tb_laser_complete &= (TASK_OVER == laser_task_vector[i]->get_statu());
  198. }
  199. if (tb_laser_complete)
  200. {
  201. break;
  202. }
  203. //计算扫描时间,若超时,并且没有点,则返回错误.
  204. auto t_end_point = std::chrono::system_clock::now();
  205. auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(t_end_point - t_start_point);
  206. second = double(duration.count()) *
  207. std::chrono::milliseconds::period::num / std::chrono::milliseconds::period::den;
  208. if (second > 0.5)
  209. {
  210. LOG(WARNING)<<"capture time out";
  211. break;
  212. }
  213. usleep(1000*10);
  214. }
  215. //检查雷达任务完成情况,是否是正常完成
  216. //释放扫描任务单
  217. for (int i = 0; i < laser_task_vector.size(); ++i) {
  218. if (laser_task_vector[i] != 0) {
  219. delete laser_task_vector[i];
  220. laser_task_vector[i] = NULL;
  221. }
  222. }
  223. LOG(INFO) << " frame :"<<++frames<<",laser scanning over cloud size:" << scan_cloud.size()
  224. <<" , time:"<<second;
  225. //处理点云--------------------------------------------------------------------------
  226. int color[3]={0,255,0};
  227. if(shutter.verify(scan_cloud.makeShared())!=SUCCESS)
  228. {
  229. color[0]=255;
  230. color[1]=0;
  231. color[2]=0;
  232. }
  233. mut.lock();
  234. viewer.removeAllPointClouds();
  235. pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(scan_cloud.makeShared(), color[0],color[1],color[2]); // green
  236. viewer.addPointCloud(scan_cloud.makeShared(), single_color, "livox");
  237. viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "livox");
  238. mut.unlock();
  239. usleep(10*1000);
  240. }
  241. */
  242. }
  243. int main(int argc,char* argv[])
  244. {
  245. //初始化日志
  246. init_glog();
  247. viewer.addCoordinateSystem(2.0,0,0,0,"car_center");
  248. int ret = livox::LdsLidar::InitLdsLidar();
  249. shutter::shutter_param shutter_param;
  250. if(read_proto_param("./setting/setting.prototxt",shutter_param)==false)
  251. {
  252. printf(" read proto failed \n");
  253. return -1;
  254. }
  255. safety_excutor* excutor=safety_excutor::CreateExcutor(shutter_param);
  256. if(excutor== nullptr)
  257. {
  258. printf(" create safety_excutor failed\n");
  259. return -1;
  260. }
  261. /*const float DEGREE=M_PI/180.0;
  262. float transform1[]={-2.31,161.58,-64,2.512,0,0};
  263. float transform2[]={176.45,28.05,71.85,0,0,0};
  264. std::string sn1="3GGDJ8S00100921";
  265. std::string sn2="3GGDJ8X00100541";
  266. Eigen::Vector3f rpy1;
  267. rpy1<<-2.31*DEGREE,161.58*DEGREE,-64*DEGREE;
  268. Eigen::Vector3f rpy2;
  269. rpy2<<176.45*DEGREE,28.05*DEGREE,71.85*DEGREE;
  270. Eigen::Vector3f t1;
  271. t1<<1.256,0,0;
  272. Eigen::Vector3f t2;
  273. t2<<-1.256,0,0;
  274. read_lidar.SetTransformParam(rpy1,t1);
  275. read_lidar1.SetTransformParam(rpy2,t2);
  276. if(read_lidar.AddBroadcastCode(sn1)!=0)
  277. printf("%s connect failed\n",sn1.c_str());
  278. if(read_lidar1.AddBroadcastCode(sn2)!=0)
  279. {
  280. printf("%s connect failed\n",sn2.c_str());
  281. }
  282. read_lidar.SetFPS(10.0);
  283. read_lidar1.SetFPS(10.0);*/
  284. usleep(3000*1000);
  285. //lidar1.AddSNCode(sn1);
  286. //lidar2.AddSNCode(sn2);
  287. std::thread* thread=new std::thread(Working);
  288. while(1)
  289. {
  290. excutor->verify();
  291. /**/
  292. usleep(33*1000);
  293. }
  294. return 0;
  295. }