|
@@ -1,406 +0,0 @@
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-#include "./laser_manager.h"
|
|
|
-
|
|
|
-#include "../tool/proto_tool.h"
|
|
|
-#include "../laser/laser_parameter.pb.h"
|
|
|
-
|
|
|
-#include <livox_sdk.h>
|
|
|
-
|
|
|
-Laser_manager::Laser_manager()
|
|
|
-{
|
|
|
- m_laser_manager_status = LASER_MANAGER_UNKNOW;
|
|
|
- mp_laser_manager_thread = NULL;
|
|
|
-
|
|
|
- mp_laser_manager_task = NULL;
|
|
|
- m_laser_number = 0;
|
|
|
-}
|
|
|
-Laser_manager::~Laser_manager()
|
|
|
-{
|
|
|
- laser_manager_uninit();
|
|
|
-}
|
|
|
-
|
|
|
-//初始化 雷达 管理模块。如下三选一
|
|
|
-Error_manager Laser_manager::laser_manager_init()
|
|
|
-{
|
|
|
- return laser_manager_init_from_protobuf(LASER_PARAMETER_ALL_PATH);
|
|
|
-}
|
|
|
-//初始化 雷达 管理模块。从文件读取
|
|
|
-Error_manager Laser_manager::laser_manager_init_from_protobuf(std::string prototxt_path)
|
|
|
-{
|
|
|
- Laser_proto::Laser_parameter_all laser_parameters;
|
|
|
-
|
|
|
- if(! proto_tool::read_proto_param(prototxt_path,laser_parameters) )
|
|
|
- {
|
|
|
- return Error_manager(LASER_MANAGER_READ_PROTOBUF_ERROR,MINOR_ERROR,"Laser_manager read_proto_param failed");
|
|
|
- }
|
|
|
-
|
|
|
- return laser_manager_init_from_protobuf(laser_parameters);
|
|
|
-}
|
|
|
-//初始化 雷达 管理模块。从protobuf读取
|
|
|
-Error_manager Laser_manager::laser_manager_init_from_protobuf(Laser_proto::Laser_parameter_all& laser_parameters)
|
|
|
-{
|
|
|
- m_laser_manager_status = LASER_MANAGER_READY;
|
|
|
- m_laser_number = laser_parameters.laser_parameters_size();
|
|
|
- m_laser_manager_working_flag = false;
|
|
|
-
|
|
|
- //创建大疆雷达
|
|
|
- int laser_cout=laser_parameters.laser_parameters_size();
|
|
|
- m_laser_vector.resize(laser_cout);
|
|
|
- for(int i=0;i<laser_parameters.laser_parameters_size();++i)
|
|
|
- {
|
|
|
- m_laser_vector[i]=LaserRegistory::CreateLaser(laser_parameters.laser_parameters(i).type(),i,
|
|
|
- laser_parameters.laser_parameters(i));
|
|
|
- if(m_laser_vector[i]!=NULL)
|
|
|
- {
|
|
|
- if(m_laser_vector[i]->connect_laser()!=SUCCESS)
|
|
|
- {
|
|
|
- char description[255]={0};
|
|
|
- sprintf(description,"Laser %d connect failed...",i);
|
|
|
- return Error_manager(LASER_CONNECT_FAILED,NORMAL,description);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- //查询是否有livox雷达,初始化库
|
|
|
- for (int i = 0; i < laser_parameters.laser_parameters_size(); ++i)
|
|
|
- {
|
|
|
- std::string type = laser_parameters.laser_parameters(i).type();
|
|
|
- if (type.find("Livox") != type.npos)
|
|
|
- {
|
|
|
- if (Start() == false)
|
|
|
- {
|
|
|
- Uninit();
|
|
|
- return Error_manager(LASER_LIVOX_SKD_INIT_FAILED,NORMAL,"Livox laser init failed...");
|
|
|
- }
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- //启动雷达管理模块的内部线程。默认wait。
|
|
|
- m_laser_manager_condition.reset(false, false, false);
|
|
|
- mp_laser_manager_thread = new std::thread(&Laser_manager::thread_work, this);
|
|
|
-
|
|
|
- return Error_code::SUCCESS;
|
|
|
-}
|
|
|
-//反初始化 雷达 管理模块。
|
|
|
-Error_manager Laser_manager::laser_manager_uninit()
|
|
|
-{
|
|
|
-
|
|
|
- //关闭线程
|
|
|
- if (mp_laser_manager_thread)
|
|
|
- {
|
|
|
- m_laser_manager_condition.kill_all();
|
|
|
- }
|
|
|
- //回收线程的资源
|
|
|
- if (mp_laser_manager_thread)
|
|
|
- {
|
|
|
- mp_laser_manager_thread->join();
|
|
|
- delete mp_laser_manager_thread;
|
|
|
- mp_laser_manager_thread = NULL;
|
|
|
- }
|
|
|
-
|
|
|
- //回收雷达的内存
|
|
|
- for (int i = 0; i < m_laser_number; ++i)
|
|
|
- {
|
|
|
- delete(m_laser_vector[i]);
|
|
|
- }
|
|
|
- //回收下发雷达任务单
|
|
|
- for (map<int, Laser_task*>::iterator iter = m_laser_task_map.begin(); iter != m_laser_task_map.end(); ++iter)
|
|
|
- {
|
|
|
- delete(iter->second);
|
|
|
- m_laser_task_map.erase(iter);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-//对外的接口函数,负责接受并处理任务单,
|
|
|
-//input:p_laser_task 雷达任务单,基类的指针,指向子类的实例,(多态)
|
|
|
-Error_manager Laser_manager::execute_task(Task_Base* p_laser_task)
|
|
|
-{
|
|
|
- LOG(INFO) << " Laser_manager::execute_task start "<< this;
|
|
|
- Error_manager t_error;
|
|
|
- Error_manager t_result;
|
|
|
-
|
|
|
- //检查指针
|
|
|
- if (p_laser_task == NULL) {
|
|
|
- return Error_manager(Error_code::POINTER_IS_NULL, Error_level::MINOR_ERROR,
|
|
|
- "Laser_manager::execute_task failed, POINTER_IS_NULL");
|
|
|
- }
|
|
|
- //检查任务类型,
|
|
|
- if (p_laser_task->get_task_type() != LASER_MANGER_SCAN_TASK)
|
|
|
- {
|
|
|
- return Error_manager(Error_code::LIVOX_TASK_TYPE_ERROR, Error_level::MINOR_ERROR,
|
|
|
- "laser task type error != LASER_MANGER_SCAN_TASK ");
|
|
|
- }
|
|
|
-
|
|
|
- //接受任务,并将任务的状态改为TASK_SIGNED已签收
|
|
|
- mp_laser_manager_task = (Laser_manager_task *) p_laser_task;
|
|
|
- mp_laser_manager_task->set_task_statu(TASK_SIGNED);
|
|
|
-
|
|
|
- //检查消息内容是否正确,
|
|
|
- //检查三维点云指针
|
|
|
- if (mp_laser_manager_task->get_task_point_cloud().get() == NULL)
|
|
|
- {
|
|
|
- t_result.error_manager_reset(Error_code::POINTER_IS_NULL,
|
|
|
- Error_level::MINOR_ERROR,
|
|
|
- "execute_task mp_task_point_cloud is null");
|
|
|
- //将任务的状态改为 TASK_ERROR 结束错误
|
|
|
- mp_laser_manager_task->set_task_statu(TASK_ERROR);
|
|
|
- //返回错误码
|
|
|
- mp_laser_manager_task->set_task_error_manager(t_result);
|
|
|
- return t_result;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if ( m_laser_manager_status != LASER_MANAGER_READY )
|
|
|
- {
|
|
|
- t_result.error_manager_reset(Error_code::LASER_MANAGER_IS_NOT_READY,
|
|
|
- Error_level::MINOR_ERROR,
|
|
|
- "execute_task m_laser_manager_status != LASER_MANAGER_READY");
|
|
|
- //将任务的状态改为 TASK_ERROR 结束错误
|
|
|
- mp_laser_manager_task->set_task_statu(TASK_ERROR);
|
|
|
- //返回错误码
|
|
|
- mp_laser_manager_task->set_task_error_manager(t_result);
|
|
|
- return t_result;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //启动雷达管理模块,的核心工作线程
|
|
|
- m_laser_manager_status = LASER_MANAGER_ISSUED_TASK;
|
|
|
- m_laser_manager_working_flag = true;
|
|
|
- m_laser_manager_condition.notify_all(true);
|
|
|
- //通知 thread_work 子线程启动。
|
|
|
-
|
|
|
- //将任务的状态改为 TASK_WORKING 处理中
|
|
|
- mp_laser_manager_task->set_task_statu(TASK_WORKING);
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- //返回错误码
|
|
|
- if (t_result != Error_code::SUCCESS)
|
|
|
- {
|
|
|
- //将任务的状态改为 TASK_ERROR 结束错误
|
|
|
- mp_laser_manager_task->set_task_statu(TASK_ERROR);
|
|
|
- //返回错误码
|
|
|
- mp_laser_manager_task->set_task_error_manager(t_result);
|
|
|
- return t_result;
|
|
|
- }
|
|
|
- return t_result;
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-//检查雷达状态,是否正常运行
|
|
|
-Error_manager Laser_manager::check_status()
|
|
|
-{
|
|
|
-
|
|
|
-}
|
|
|
-//结束任务单,stop之后,要检查线程状态和数据结果,然后才能 end_task
|
|
|
-Error_manager Laser_manager::end_task()
|
|
|
-{
|
|
|
- LOG(INFO) << " Laser_manager::end_task "<< this;
|
|
|
-
|
|
|
- m_laser_manager_working_flag=false;
|
|
|
- m_laser_manager_condition.notify_all(false);
|
|
|
-
|
|
|
- laser_task_map_clear_and_delete();
|
|
|
-
|
|
|
- //在结束任务单时,将雷达任务状态改为 TASK_OVER 已结束
|
|
|
- if(mp_laser_manager_task !=NULL)
|
|
|
- {
|
|
|
- //判断任务单的错误等级,
|
|
|
- if ( mp_laser_manager_task->get_task_error_manager().get_error_level() < Error_level::MINOR_ERROR)
|
|
|
- {
|
|
|
- if ( m_laser_manager_status == LASER_MANAGER_ISSUED_TASK || m_laser_manager_status == LASER_MANAGER_WAIT_REPLY)
|
|
|
- {
|
|
|
- //故障等级为 NORMAL NEGLIGIBLE_ERROR MINOR_ERROR,则恢复待机,可以接受下一次的任务单
|
|
|
- m_laser_manager_status = LASER_MANAGER_READY;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //故障等级为 MAJOR_ERROR CRITICAL_ERROR,则雷达故障,不可以再接受任务单。
|
|
|
- m_laser_manager_status = LASER_MANAGER_FAULT;
|
|
|
- }
|
|
|
- //强制改为TASK_OVER,不管它当前在做什么。
|
|
|
- mp_laser_manager_task->set_task_statu(TASK_OVER);
|
|
|
- }
|
|
|
- std::cout << "------Laser_manager::end_task()------."<<mp_laser_manager_task->get_task_error_manager().to_string() << std::endl;
|
|
|
- return Error_code::SUCCESS;
|
|
|
-}
|
|
|
-
|
|
|
-//释放下发的任务单
|
|
|
-Error_manager Laser_manager::laser_task_map_clear_and_delete()
|
|
|
-{
|
|
|
- for ( map<int, Laser_task*>::iterator map_iter2 = m_laser_task_map.begin(); map_iter2 != m_laser_task_map.end(); )
|
|
|
- {
|
|
|
- //销毁下发的任务单。
|
|
|
- delete(map_iter2->second);
|
|
|
- map_iter2 = m_laser_task_map.erase(map_iter2);
|
|
|
- //注:erase 删除当前map_iter2之后返回下一个节点,当前的map_iter2无效化,
|
|
|
- //for循环不用 ++map_iter2
|
|
|
- }
|
|
|
- return Error_code::SUCCESS;
|
|
|
-}
|
|
|
-
|
|
|
-//下发给子雷达任务。这里为下发雷达任务分配内存, 后续要记得回收 m_laser_task_map 。
|
|
|
-Error_manager Laser_manager::issued_task(int laser_index)
|
|
|
-{
|
|
|
- Error_manager t_error;
|
|
|
-
|
|
|
- if ( laser_index < 0 || laser_index >= m_laser_number )
|
|
|
- {
|
|
|
- return Error_manager(Error_code::LASER_MANAGER_LASER_INDEX_ERRPR, Error_level::MINOR_ERROR,
|
|
|
- " issued_task laser_index error ");
|
|
|
- }
|
|
|
-
|
|
|
- //创建雷达扫描任务,
|
|
|
- // 这里为下发雷达任务分配内存,后续要记得回收。
|
|
|
- Laser_task* t_laser_task=new Laser_task();
|
|
|
- mp_laser_manager_task->trans_to_laser_task(t_laser_task,laser_index,m_laser_vector[laser_index],
|
|
|
- TASK_CREATED,std::chrono::milliseconds(7000));
|
|
|
-
|
|
|
- //保存雷达扫描任务 到 m_laser_task_map
|
|
|
- map<int, Laser_task*>::iterator map_iter = m_laser_task_map.find(laser_index);
|
|
|
- if ( map_iter != m_laser_task_map.end() )
|
|
|
- {
|
|
|
- //如果重复,则清除原有的,用新的覆盖。
|
|
|
- delete(map_iter->second);
|
|
|
- m_laser_task_map[laser_index] = t_laser_task;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- m_laser_task_map[laser_index] = t_laser_task;
|
|
|
- }
|
|
|
-
|
|
|
- //发送任务单给雷达
|
|
|
-// t_error=m_laser_vector[laser_index]->execute_task(t_laser_task);
|
|
|
- task_command_manager::get_instance_references().execute_task(t_laser_task);
|
|
|
-
|
|
|
- if(t_error!=SUCCESS)
|
|
|
- {
|
|
|
- ;
|
|
|
- //这里的故障处理很复杂,以后再写。
|
|
|
- //部分成功,部分失败。
|
|
|
- }
|
|
|
-
|
|
|
- return t_error;
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-//mp_laser_manager_thread 线程执行函数,
|
|
|
-//thread_work 内部线程负责分发扫描任务给下面的雷达,并且回收汇总雷达的数据
|
|
|
-void Laser_manager::thread_work()
|
|
|
-{
|
|
|
- LOG(INFO) << " mp_laser_manager_thread start "<< this;
|
|
|
- Error_manager t_error;
|
|
|
- Error_manager t_result;
|
|
|
-
|
|
|
- //雷达管理的独立线程,负责控制管理所有的雷达。
|
|
|
- while (m_laser_manager_condition.is_alive())
|
|
|
- {
|
|
|
- m_laser_manager_condition.wait();
|
|
|
- if ( m_laser_manager_condition.is_alive() )
|
|
|
- {
|
|
|
- if ( mp_laser_manager_task == NULL )
|
|
|
- {
|
|
|
- m_laser_manager_status = LASER_MANAGER_FAULT;
|
|
|
- m_laser_manager_working_flag = false;
|
|
|
- m_laser_manager_condition.notify_all(false);
|
|
|
- }
|
|
|
- //下发任务
|
|
|
- else if(m_laser_manager_status == LASER_MANAGER_ISSUED_TASK)
|
|
|
- {
|
|
|
- //分发扫描任务给下面的雷达
|
|
|
- if ( mp_laser_manager_task->get_select_all_laser_flag() )
|
|
|
- {
|
|
|
- //下发任务给所有的雷达
|
|
|
- for (int i = 0; i < m_laser_number; ++i)
|
|
|
- {
|
|
|
- //下发给子雷达任务。这里为下发雷达任务分配内存, 后续要记得回收 m_laser_task_map 。
|
|
|
- t_error = issued_task(i);
|
|
|
- if ( t_error != SUCCESS)
|
|
|
- {
|
|
|
- t_result.compare_and_cover_error(t_error);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //下发任务给选中的雷达
|
|
|
- std::vector<int> & t_select_laser_id_vector = mp_laser_manager_task->get_select_laser_id_vector();
|
|
|
- for (int i = 0; i < t_select_laser_id_vector.size(); ++i)
|
|
|
- {
|
|
|
- //下发给子雷达任务。这里为下发雷达任务分配内存, 后续要记得回收 m_laser_task_map 。
|
|
|
- t_error = issued_task(t_select_laser_id_vector[i]);
|
|
|
- if ( t_error != SUCCESS)
|
|
|
- {
|
|
|
- t_result.compare_and_cover_error(t_error);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- //下发任务之后,修改状态为等待答复。
|
|
|
- m_laser_manager_status = LASER_MANAGER_WAIT_REPLY;
|
|
|
- }
|
|
|
- //等待答复
|
|
|
- else if(m_laser_manager_status == LASER_MANAGER_WAIT_REPLY)
|
|
|
- {
|
|
|
- map<int, Laser_task*>::iterator map_iter;
|
|
|
- for ( map_iter = m_laser_task_map.begin(); map_iter != m_laser_task_map.end(); ++map_iter)
|
|
|
- {
|
|
|
- if ( map_iter->second->is_over_time() )
|
|
|
- {
|
|
|
- //超时处理。取消任务。
|
|
|
- m_laser_vector[map_iter->first]->cancel_task();
|
|
|
- map_iter->second->set_task_statu(TASK_DEAD);
|
|
|
- t_error.error_manager_reset(Error_code::LASER_TASK_OVER_TIME, Error_level::MINOR_ERROR,
|
|
|
- " LASER_TASK is_over_time ");
|
|
|
- map_iter->second->set_task_error_manager(t_error);
|
|
|
- }
|
|
|
- if (!( map_iter->second->get_task_statu() == TASK_OVER
|
|
|
- || map_iter->second->get_task_statu() == TASK_ERROR
|
|
|
- || map_iter->second->get_task_statu() == TASK_DEAD) )
|
|
|
- {
|
|
|
- //等待任务继续完成,等1ms
|
|
|
- std::this_thread::sleep_for(std::chrono::milliseconds(1));
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- //如果下发的任务全部结束,那么汇总所有的结果, 并销毁下发的任务单。
|
|
|
- if(map_iter == m_laser_task_map.end() )
|
|
|
- {
|
|
|
- for ( map<int, Laser_task*>::iterator map_iter2 = m_laser_task_map.begin(); map_iter2 != m_laser_task_map.end(); )
|
|
|
- {
|
|
|
- //数据汇总,
|
|
|
- //由于 pcl::PointCloud<pcl::PointXYZ>::Ptr mp_task_point_cloud; 是所有任务单共用的,所以不用处理了。自动就在一起。
|
|
|
-
|
|
|
- //错误汇总
|
|
|
- t_result.compare_and_cover_error(map_iter2->second->get_task_error_manager());
|
|
|
-
|
|
|
- //销毁下发的任务单。
|
|
|
- delete(map_iter2->second);
|
|
|
- map_iter2 = m_laser_task_map.erase(map_iter2);
|
|
|
- //注:erase 删除当前map_iter2之后返回下一个节点,当前的map_iter2无效化,
|
|
|
- //for循环不用 ++map_iter2
|
|
|
- }
|
|
|
-
|
|
|
- mp_laser_manager_task->set_task_error_manager(t_result);
|
|
|
- //结束任务
|
|
|
- end_task();
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
- LOG(INFO) << " mp_laser_manager_thread end :"<<this;
|
|
|
- return;
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-
|