HI Apollo Team,
我在學習Planning Source Code 中有個疑問,
關於eference_line_provider_ 在Init() 產生後, 每一段時間會在RunOnce()中重新產生新的reference_line_provider_
我的疑問是在Start()中, 對reference_line_provider_ ->Start()呼叫了這個Function 產生Thread出來工作
但又在之後的RunOnce()中產生新的reference_line_provider_, 如此舊的reference_line_provider_就被release了, 而新的reference_line_provider_也沒呼叫Start()
這樣的程序流程是正確的嗎?
謝謝
Status Planning::Start() {
timer_ = AdapterManager::CreateTimer(
ros::Duration(1.0 / FLAGS_planning_loop_rate), &Planning::OnTimer, this);
// The "reference_line_provider_" may not be created yet in navigation mode.
// It is necessary to check its existence.
if (reference_line_provider_) {
reference_line_provider_->Start();
}
start_time_ = Clock::NowInSeconds();
AINFO << "Planning started";
return Status::OK();
}
HI @douqian
整個流程為 Planning::Init() -> Planning::Start() -> spin()
所以整個Planning 的生命週期中
(A)reference_line_provider_->Start() 只會執行一次並產生ReferenceLineProvider::GenerateThread
我的困惑就是在於OnTimer() 中的RunOnce()內會一直重新產生新的(B)reference_line_provider_並呼叫(A)reference_line_provider_ 的destructor, 如此(A)reference_line_provider_ 的GenerateThread消失了
而(B)reference_line_provider_也沒機會產生GenerateThread
在學習的過程中對這段的不解這段設計的核心意義, 因為GenerateThread只存在非常短暫的時間
謝謝
RunOnce()中,在navigation mode的情况下会reference_line_provider_ = std::make_unique
navigation mode会实时生成基于车身坐标系的地图(使用以车辆当前位置为原点的相对坐标系)供planning使用。
if (FLAGS_use_navigation_mode) {
// recreate reference line provider in every cycle
hdmap_ = HDMapUtil::BaseMapPtr();
// Prefer "std::make_unique" to direct use of "new".
// Reference "https://herbsutter.com/gotw/_102/" for details.
reference_line_provider_ = std::make_unique
}
Hi @douqian, 謝謝您的說明