LivoxMid100Laser.cpp 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. #include "LivoxMid100Laser.h"
  2. #include <glog/logging.h>
  3. RegisterLaser(LivoxMid100)
  4. CLivoxMid100Laser::CLivoxMid100Laser(int id, Laser_proto::laser_parameter laser_param)
  5. :CLivoxLaser(id, laser_param)
  6. {
  7. //设备livox扫描最大帧数
  8. m_frame_maxnum = laser_param.frame_num();
  9. //判断参数类型,
  10. if (laser_param.type() == "LivoxMid100")
  11. {
  12. std::string sn = laser_param.sn();
  13. std::string sn1 = sn, sn2 = sn, sn3 = sn;
  14. sn1 += "1";
  15. sn2 += "2";
  16. sn3 += "3";
  17. g_sn_laser.insert(std::make_pair(sn1, this));
  18. g_sn_laser.insert(std::make_pair(sn2, this));
  19. g_sn_laser.insert(std::make_pair(sn3, this));
  20. //初始化livox
  21. InitLivox();
  22. }
  23. }
  24. CLivoxMid100Laser::~CLivoxMid100Laser()
  25. {
  26. }
  27. //雷达链接设备,为3个线程添加线程执行函数。
  28. Error_manager CLivoxMid100Laser::connect_laser()
  29. {
  30. Error_manager t_error;
  31. //设置点云变换矩阵
  32. double matrix[12]={0};
  33. matrix[0]=m_laser_param.mat_r00();
  34. matrix[1]=m_laser_param.mat_r01();
  35. matrix[2]=m_laser_param.mat_r02();
  36. matrix[3]=m_laser_param.mat_r03();
  37. matrix[4]=m_laser_param.mat_r10();
  38. matrix[5]=m_laser_param.mat_r11();
  39. matrix[6]=m_laser_param.mat_r12();
  40. matrix[7]=m_laser_param.mat_r13();
  41. matrix[8]=m_laser_param.mat_r20();
  42. matrix[9]=m_laser_param.mat_r21();
  43. matrix[10]=m_laser_param.mat_r22();
  44. matrix[11]=m_laser_param.mat_r23();
  45. t_error = set_laser_matrix(matrix, 12);
  46. if ( t_error != Error_code::SUCCESS )
  47. {
  48. return t_error;
  49. }
  50. return CLivoxLaser::connect_laser();
  51. }
  52. //雷达断开链接,释放3个线程
  53. Error_manager CLivoxMid100Laser::disconnect_laser()
  54. {
  55. return CLivoxLaser::disconnect_laser();
  56. }
  57. //对外的接口函数,负责接受并处理任务单,
  58. //input:p_laser_task 雷达任务单,基类的指针,指向子类的实例,(多态)
  59. //注:这个函数为虚函数,实际的处理任务的代码由子类重载并实现。
  60. Error_manager CLivoxMid100Laser::execute_task(Task_Base* p_laser_task)
  61. {
  62. LOG(INFO) << " CLivoxMid100Laser::execute_task start "<< this;
  63. Error_manager t_error;
  64. Error_manager t_result;
  65. //检查指针
  66. if (p_laser_task == NULL) {
  67. return Error_manager(Error_code::POINTER_IS_NULL, Error_level::MINOR_ERROR,
  68. "Laser_base::porform_task failed, POINTER_IS_NULL");
  69. }
  70. //检查任务类型,
  71. if (p_laser_task->get_task_type() != LASER_TASK)
  72. {
  73. return Error_manager(Error_code::LIVOX_TASK_TYPE_ERROR, Error_level::MINOR_ERROR,
  74. "laser task type error != LASER_TASK");
  75. }
  76. //接受任务,并将任务的状态改为TASK_SIGNED已签收
  77. mp_laser_task = (Laser_task *) p_laser_task;
  78. mp_laser_task->set_task_statu(TASK_SIGNED);
  79. //检查消息内容是否正确,
  80. //检查三维点云指针
  81. if (mp_laser_task->get_task_point_cloud().get() == NULL)
  82. {
  83. t_result.error_manager_reset(Error_code::POINTER_IS_NULL,
  84. Error_level::MINOR_ERROR,
  85. "execute_task mp_task_point_cloud is null");
  86. //将任务的状态改为 TASK_OVER 结束任务
  87. mp_laser_task->set_task_statu(TASK_OVER);
  88. //返回错误码
  89. mp_laser_task->set_task_error_manager(t_result);
  90. return t_result;
  91. }
  92. else
  93. {
  94. m_frame_maxnum=mp_laser_task->get_task_frame_maxnum();
  95. //设置保存文件的路径
  96. std::string save_path = mp_laser_task->get_task_save_path();
  97. t_error = set_open_save_path(save_path);
  98. if ( t_error != Error_code::SUCCESS )
  99. {
  100. //文件保存文件的路径的设置 允许失败。继续后面的动作
  101. t_result.compare_and_cover_error(t_error);
  102. }
  103. //启动雷达扫描
  104. t_error = start_scan();
  105. if ( t_error != Error_code::SUCCESS )
  106. {
  107. t_result.compare_and_cover_error(t_error);
  108. //将任务的状态改为 TASK_OVER 结束任务
  109. mp_laser_task->set_task_statu(TASK_OVER);
  110. //返回错误码
  111. mp_laser_task->set_task_error_manager(t_result);
  112. return t_result;
  113. }
  114. else
  115. {
  116. //将任务的状态改为 TASK_WORKING 处理中
  117. mp_laser_task->set_task_statu(TASK_WORKING);
  118. }
  119. }
  120. //返回错误码
  121. if (t_result != Error_code::SUCCESS)
  122. {
  123. mp_laser_task->set_task_error_manager(t_result);
  124. }
  125. return t_result;
  126. }
  127. //检查雷达状态,是否正常运行
  128. Error_manager CLivoxMid100Laser::check_laser()
  129. {
  130. return CLivoxLaser::check_laser();
  131. }
  132. //雷达的启动接口函数, 让雷达进行扫描,一般需要子类重载,不同的雷达开始方式不同。
  133. Error_manager CLivoxMid100Laser::start_scan()
  134. {
  135. LOG(INFO) << " livoxMid100 start :" << m_laser_param.sn();
  136. //清空livox子类的队列,
  137. m_queue_livox_data.clear_and_delete();
  138. g_count[m_handle1] = 0;
  139. g_count[m_handle2] = 0;
  140. g_count[m_handle3] = 0;
  141. return CLivoxLaser::start_scan();
  142. }
  143. //雷达的停止接口函数, 让雷达停止扫描,一般需要子类重载,不同的雷达结束方式不同。
  144. Error_manager CLivoxMid100Laser::stop_scan()
  145. {
  146. LOG(INFO)<<" livoxmid100 stoped !!!"<<m_laser_param.sn();
  147. return CLivoxLaser::stop_scan();
  148. }
  149. //结束任务单,stop之后,要检查线程状态和数据结果,然后才能 end_task
  150. Error_manager CLivoxMid100Laser::end_task()
  151. {
  152. return CLivoxLaser::end_task();
  153. }
  154. //判断雷达状态是否为待机,如果已经准备好,则可以执行任务。
  155. //子类重载 is_ready(),里面增加livox sdk后台线程状态的判断。
  156. bool CLivoxMid100Laser::is_ready()
  157. {
  158. //3个livox雷达设备的状态,livox sdk后台线程的状态
  159. bool cond1=g_devices[m_handle1].device_state == kDeviceStateConnect ||
  160. g_devices[m_handle1].device_state == kDeviceStateSampling;
  161. bool cond2=g_devices[m_handle2].device_state == kDeviceStateConnect ||
  162. g_devices[m_handle2].device_state == kDeviceStateSampling;
  163. bool cond3=g_devices[m_handle3].device_state == kDeviceStateConnect ||
  164. g_devices[m_handle3].device_state == kDeviceStateSampling;
  165. if ( cond1 && cond2 && cond3 && m_laser_statu == LASER_READY )
  166. {
  167. true;
  168. }
  169. else
  170. {
  171. false;
  172. }
  173. }
  174. void CLivoxMid100Laser::UpdataHandle()
  175. {
  176. std::string sn = m_laser_param.sn();
  177. std::string sn1 = sn, sn2 = sn, sn3 = sn;
  178. sn1 += "1";
  179. sn2 += "2";
  180. sn3 += "3";
  181. if (g_sn_handle.find(sn1) != g_sn_handle.end())
  182. {
  183. m_handle1 = g_sn_handle[sn1];
  184. }
  185. if (g_sn_handle.find(sn2) != g_sn_handle.end())
  186. {
  187. m_handle2 = g_sn_handle[sn2];
  188. }
  189. if (g_sn_handle.find(sn3) != g_sn_handle.end())
  190. {
  191. m_handle3 = g_sn_handle[sn3];
  192. }
  193. }
  194. bool CLivoxMid100Laser::IsScanComplete()
  195. {
  196. //雷达的采集帧数判断,直接比较任务单里面的帧数最大值
  197. if(mp_laser_task==NULL)
  198. {
  199. return false;
  200. }
  201. else
  202. {
  203. int frame_count=mp_laser_task->get_task_frame_maxnum();
  204. return g_count[m_handle1] >= frame_count && g_count[m_handle2] >= frame_count
  205. && g_count[m_handle2] >= frame_count;
  206. }
  207. }