LivoxMid100Laser.cpp 6.0 KB

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