class HydraPipeline {
public:
HydraPipeline(const PipelineConfig& config,
int robot_id = 0,
int config_verbosity = 1);
virtual ~HydraPipeline();
virtual void init();
virtual void start();
virtual void stop();
virtual void save();
template <typename Derived = Module>
Derived* getModule(const std::string& name);
protected:
void showModules() const;
std::string getModuleInfo(const std::string& name, const Module* module) const;
protected:
int config_verbosity_;
SharedDsgInfo::Ptr frontend_dsg_;
SharedDsgInfo::Ptr backend_dsg_;
SharedModuleState::Ptr shared_state_;
Module::Ptr input_module_;
std::map<std::string, Module::Ptr> modules_;
};
HydraPipeline 클래스는 여러 모듈을 관리하며, 각 모듈의 생명 주기(start, stop, save)를 처리합니다.
생성자(HydraPipeline):
frontend_dsg_
와 backend_dsg_
를 통해 DSG의 전방(frontend)과 후방(backend) 정보를 공유init
함수:
start
, stop
, save
함수:
getModule
함수:
nullptr
을 반환합니다.Derived
로 캐스팅하여 반환합니다.showModules
및 getModuleInfo
함수:
showModules
는 파이프라인에 포함된 모든 모듈들의 정보를 출력하는 역할을 합니다.getModuleInfo
는 각 모듈의 상태와 정보를 문자열 형태로 반환하며, 이를 통해 각 모듈의 상태를 확인할 수 있습니다.HydraPipeline::HydraPipeline(const PipelineConfig& pipeline_config,
int robot_id,
int config_verbosity)
: config_verbosity_(config_verbosity) {
const auto& config = GlobalInfo::init(pipeline_config, robot_id, true);
frontend_dsg_ = config.createSharedDsg();
backend_dsg_ = config.createSharedDsg();
shared_state_.reset(new SharedModuleState());
shared_state_->lcd_graph = config.createSharedDsg();
shared_state_->backend_graph = config.createSharedDsg();
}
shared_state_
: lcd_graph
)와 후방 그래프(backend_graph
) 등이 포함 start()
함수:void HydraPipeline::start() {
VLOG(config_verbosity_) << std::endl << getModuleInfo("input", input_module_.get());
showModules();
if (input_module_) {
input_module_->start();
}
for (auto&& [name, module] : modules_) {
if (!module) {
LOG(FATAL) << "Found unitialized module: " << name;
continue;
}
module->start();
}
if (input_module_) {
modules_["input"] = input_module_;
}
}
start()
는 파이프라인의 모든 모듈을 시작합니다.stop()
함수:void HydraPipeline::stop() {
for (auto&& [name, module] : modules_) {
if (!module) {
LOG(FATAL) << "Found unitialized module: " << name;
continue;
}
module->stop();
}
}
stop()
는 파이프라인의 모든 모듈을 중지합니다. 각 모듈을 순회하면서 stop()
을 호출하여 종료합니다.save()
함수:void HydraPipeline::save() {
const auto& logs = GlobalInfo::instance().getLogs();
if (!logs || !logs->valid()) {
return;
}
for (auto&& [name, module] : modules_) {
if (!module) {
LOG(FATAL) << "Found unitialized module: " << name;
continue;
}
module->save(*logs);
}
}
save()
는 파이프라인의 모든 모듈의 상태를 저장합니다.save()
함수를 호출하여 상태를 기록합니다.showModules()
및 getModuleInfo()
함수:std::string HydraPipeline::getModuleInfo(const std::string& name,
const Module* module) const {
const auto print_width = config::Settings().print_width;
std::stringstream ss;
ss << makeBanner(name, print_width, '*', true, true);
if (!module) {
ss << "UNITIALIZED MODULE!" << std::endl;
} else {
const auto info = module->printInfo();
if (!info.empty()) {
ss << info << std::endl;
}
}
ss << std::string(print_width, '*') << std::endl;
return ss.str();
}
getModuleInfo()
: 주어진 모듈의 상태를 문자열로 변환하여 반환합니다. 모듈이 초기화되지 않았으면 UNITIALIZED MODULE!
이라는 메시지를 출력합니다.makeBanner()
함수를 사용하여 각 모듈의 정보를 보기 쉽게 표시합니다.void HydraPipeline::showModules() const {
const auto print_width = config::Settings().print_width;
std::stringstream ss;
ss << std::endl << makeBanner("Modules", print_width, '=', true, true);
for (auto&& [name, module] : modules_) {
ss << std::endl << getModuleInfo(name, module.get());
}
VLOG(config_verbosity_) << ss.str();
}
showModules()
: 모든 모듈의 정보를 출력합니다. modules_
는 모듈의 이름과 포인터를 가지는 맵(map)으로, 이를 순회하며 각 모듈의 정보를 출력합니다. VLOG
는 설정된 로깅 수준에 따라 로그를 출력합니다.