Apollo Cyber 運(yùn)行時(shí)。
其框架 ( Apollo Cyber RT Framework ) 是基于組件概念來構(gòu)建的。
組件化開發(fā)的成果是基礎(chǔ)庫和公共組件,其原則是高重用,低耦合。
如果讓我們來看組件化開發(fā)的定義,它的著重點(diǎn)就是代碼重用。代碼重構(gòu)這一步最后的結(jié)果就是提煉出一個(gè)個(gè)組件給不同的功能使用。
這里我們可以看一下其中的依賴關(guān)系:具體功能依賴提煉出來的組件,組件本身之間可能也有依賴關(guān)系,但一般不多。
每個(gè)組件都是Cyber框架的一個(gè)構(gòu)建塊, 它包括一個(gè)特定的算法模塊,此算法模塊處理一組輸入數(shù)椐并產(chǎn)生一組輸出數(shù)椐。
要?jiǎng)?chuàng)建并啟動(dòng)一個(gè)算法組件, 需要通過以下4個(gè)步驟:
初如化組件的文件結(jié)構(gòu)
實(shí)現(xiàn)組件類
設(shè)置配置文件
啟動(dòng)組件
下面的例子中,阿波君將為大家展示如何創(chuàng)建、編譯和運(yùn)行一個(gè)組件,并觀察組件在屏幕上的輸出。
如果想更深入的探索Apollo Cyber RT框架。
可以在這個(gè)目錄/apollo/cyber/examples/找到很多例子,這些例子詳細(xì)展示如何使用Cyber框架的各種功能。
Note: 這些例子必須運(yùn)行在Apollo docker環(huán)境, 且需要通過Bazel來編譯。
例如組件的根目錄為
/apollo/cyber/examples/common_component_example/
需要?jiǎng)?chuàng)建以下文件:
Header file: common_component_example.h
Source file: common_component_example.cc
Build file: BUILD
DAG dependency file: common.dag
Launch file: common.launch
1#include 2#include"cyber/class_loader/class_loader.h" 3#include"cyber/component/component.h" 4#include"cyber/examples/proto/examples.pb.h" 5 6usingapollo::cyber::examples::proto::Driver; 7usingapollo::cyber::Component; 8usingapollo::cyber::ComponentBase; 910classCommonComponentSample:publicComponent{11public:12boolInit()override;13boolProc(conststd::shared_ptr&msg0,14conststd::shared_ptr&msg1)override;15};1617CYBER_REGISTER_COMPONENT(CommonComponentSample)
如何實(shí)現(xiàn)common_component_example.h:
繼承 Component 類;
定義自己的Init和Proc 函數(shù). Proc 需要指定輸入數(shù)椐類型;
使用CYBER_REGISTER_COMPONENT宏定義把組件類注冊(cè)成全局可用。
對(duì)于源文件 common_component_example.cc, Init 和 Proc 這兩個(gè)函數(shù)需要實(shí)現(xiàn)。
1#include"cyber/examples/common_component_example/common_component_example.h" 2#include"cyber/class_loader/class_loader.h" 3#include"cyber/component/component.h" 4 5boolCommonComponentSample::Init(){ 6AINFO<"Commontest?component?init"; 7??return?true; 8} 910bool?CommonComponentSample::Proc(const?std::shared_ptr&?msg0,11???????????????????????????????const?std::shared_ptr&?msg1)?{12??AINFO?<"Start?common?component?Proc?["?<msg_id()<"]?["13????????<msg_id()<"]";14??return?true;15}
創(chuàng)建 Bazel BUILD 文件.
1load("http://tools:cpplint.bzl","cpplint") 2 3package(default_visibility=["http://visibility:public"]) 4 5cc_binary( 6name="libcommon_component_example.so", 7deps=[":common_component_example_lib"], 8linkopts=["-shared"], 9linkstatic=False,10)1112cc_library(13name="common_component_example_lib",14srcs=[15"common_component_example.cc",16],17hdrs=[18"common_component_example.h",19],20deps=[21"http://cyber",22"http://cyber/examples/proto:examples_cc_proto",23],24)2526cpplint()
在DAG依賴配置文件 (例如common.dag)中配置下面的項(xiàng):
Channel names: 輸入輸出數(shù)椐的Channel名字
Library path: 此組件最終編譯出的庫的名字
Class name: 此組件的入口類的名字
1#DefineallcomsinDAGstreaming. 2component_config{ 3component_library:"/apollo/bazel-bin/cyber/examples/common_component_example/libcommon_component_example.so" 4components{ 5class_name:"CommonComponentSample" 6config{ 7name:"common" 8readers{ 9channel:"/apollo/prediction"10}11readers{12channel:"/apollo/test"13}14}15}16}
在Launch啟動(dòng)文件中(common.launch), 配置下面的項(xiàng):
組件的名字。
上一步創(chuàng)建的dag配置的名字。
組件運(yùn)行時(shí)所在的進(jìn)程目錄。
1
通過下面的命令來編譯組件:
1bash/apollo/apollo.shbuild
Note:確定組件正常編譯成功
然后配置環(huán)境:
1cd/apollo/cyber2sourcesetup.bash
有兩種方法來啟動(dòng)組件:
使用Launch文件來啟動(dòng) (推薦這種方式)
1cyber_launchstart/apollo/cyber/examples/common_component_example/common.launch
使用Dag文件來啟動(dòng):
1mainboard-d/apollo/cyber/examples/common_component_example/common.dag
在完上步驟后,您就使用Cyber RT成功創(chuàng)建一個(gè)新的組件。
-
組件
+關(guān)注
關(guān)注
1文章
512瀏覽量
17813
原文標(biāo)題:技術(shù)文檔 | 如何使用Cyber RT創(chuàng)建新組件
文章出處:【微信號(hào):Apollo_Developers,微信公眾號(hào):Apollo開發(fā)者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論