2.4.1 基本组件演示(上)
需求
启动之前的消息发布节点,对订阅到的数据进行过滤,只获取其中的姓名和年龄信息并输出到终端,运行效果如下:
准备
- 保证之前话题通信中的发布方可以正常运行;
- 在 demo_cc 目录下新建文件夹:component_common01,并在 component_common01 下新建BUILD文件。
实现流程
上述需求可以通过组件实现,只要包括如下步骤:
- 自定义类继承 Component 类,并重写其 Init() 与 Proc() 函数;
- 编写 dag 文件与 launch 文件;
- 编辑BUILD文件;
- 编译执行。
1.继承并重写 Component 类
component_common01 目录下新建 C++ 文件 common_cpt.h,输入如下内容:
/*
组件头文件
*/
#include "cyber/component/component.h"
#include "cyber/demo_base_proto/student.pb.h"
using apollo::cyber::Component;
using apollo::cyber::demo_base_proto::Student;
class CommonCpt : public Component<Student> {
public:
bool Init() override;
bool Proc(const std::shared_ptr<Student>& stu) override;
};
CYBER_REGISTER_COMPONENT(CommonCpt)
在 component_common01 目录下新建 C++ 文件 common_cpt.cc,输入如下内容:
#include "cyber/demo_cc/component_common01/common_cpt.h"
bool CommonCpt::Init() {
AINFO << "................................... int .........................";
return true;
}
bool CommonCpt::Proc(const std::shared_ptr<Student>& stu) {
// AINFO << "do data.....";
AINFO << "do message:" << stu->name() << " -- " << stu->age();
return true;
}
代码解释:
使用的模板与订阅的消息类型一致。
Init() 函数是用于初始化的,只会执行一次。
proc()函数在订阅到消息时就会被回调执行。
2.编写 dag 文件与 launch 文件
在 component_common01 目录下新建 cpt.dag 文件,输入如下内容:
# Define all coms in DAG streaming.
module_config {
module_library : "/apollo/bazel-bin/cyber/demo_cc/component_common01/lib_common_cpt.so"
components {
class_name : "CommonCpt"
config {
name : "my_common"
readers {
channel: "chatter"
}
}
}
}
在 component_common01 目录下新建 cpt.launch 文件,输入如下内容:
<cyber>
<module>
<name>my_common</name>
<dag_conf>/apollo/cyber/demo_cc/component_common01/cpt.dag</dag_conf>
<process_name>my_common</process_name>
</module>
</cyber>
3.编辑BUILD文件
配置文件BUILD添加内容如下:
package(default_visibility = ["//visibility:public"])
# https://docs.bazel.build/versions/master/be/c-cpp.html#cc_library
cc_library(
name = "common_cpt_lib",
srcs = ["common_cpt.cc"],
hdrs = ["common_cpt.h"],
deps = [
"//cyber",
"//cyber/demo_base_proto:student_cc"
],
)
# https://docs.bazel.build/versions/master/be/c-cpp.html#cc_binary
cc_binary(
name = "lib_common_cpt.so",
linkshared = True,
linkstatic = False,
deps = [":common_cpt_lib"],
)
filegroup(
name = "conf",
srcs = [
":cpt.dag",
":cpt.launch",
],
)
4.编译执行
编译:
bazel build cyber/demo_cc/component_common01/...
执行(需要两个终端):
终端A执行发布方:
source cyber/setup.bash
./bazel-bin/cyber/demo_cc/demo01_talker
终端B执行组件:
source cyber/setup.bash
cyber_launch start cyber/demo_cc/component_common01/cpt.launch
或执行 dag 文件:
mainboard -d cyber/demo_cc/component_common01/cpt.dag
关闭组件(需要系启动终端):
source cyber/setup.bash
cyber_launch stop cyber/demo_cc/component_common01/cpt.launch
执行结果:B中和之前运行结果一致,A中输出对B二次处理的数据。