Cyber-组件

 

/*
    组件
        CyberRT提供的用于构建应用程序模块的基类
        用于实现数据过滤、融合
        例如无人车上不同传感器之间的数据融合
*/

/*
    需求
        启动之前的消息发布节点,对订阅到的数据进行过滤,只获取其中的姓名和年龄信息并输出到终端
    准备
        在demo_cc目录下新建文件夹:component_common01,并在component_common01下新建BUILD文件
    流程
        1.自定义类继承Component类,并重写其Init()与Proc()函数;
        2.编写dag文件与launch文件
        3.编写BUILD文件
        4.编译执行
*/
/////////////////////////////.h文件/////////////////////////////////////////
// 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) // 在cyber rt中注册组件

///////////////////////////////////////////////////////////////////////////

//////////////////////////////.cpp文件/////////////////////////////////////
// 在component_common01目录下新建c++文件common_cpt.cc
#include "cyber/demo_cc/component_common01/common_cpt.h"

bool CommonCpt::Init()
{
    AINFO << "init...";
    return true;
}

bool CommonCpy::Proc(const std::shared_ptr<Student>& stu){
    AINFO << "do message: " << stu->name() << " -- " << stu->age();
    return true;
}
/////////////////////////////////////////////////////////////////////////

////////////////////////dag文件/////////////////////////////////////
// 模块拓扑关系的配置文件,可以在dag文件中定义使用的Component和上游/下游通道
// 在component_common01目录下新建cpt.dag文件
module_config {
    // 动态库路径
    module_library : "/apollo/bezal-bin/cyber/demo_cc/component_common01/lib_common_cpt.so"
    components {
        class_name : "CommonCpt" // 类名
        config {
            // 该配置文件名称,自定义
            name : "my_common"
            // 订阅的消息的话题,有几个发布方,就写几个readers
            readers {
                channel : "chatter"
            }
        }
    }
}
//////////////////////////launch文件//////////////////////////////////////////
// 一种启动模块的简单方法,通过在launch文件中定义一个或者多个dag文件,可以同时启动多个模块
// 在component_common01目录下新建cpt.launch文件
<cyber>
    <module>
        <name>my_common</name>
        // 指向dag文件的绝对路径
        <dag_conf>/apollo/bezal-bin/cyber/demo_cc/component_common01/cpt.dag</dag_conf>
        <process_name>my_common</process_name>
    </module>
</cyber>
////////////////////////////////////////////////////////////////////////////

/////////////////////////////BUILD///////////////////////////////////////
package(default_visibility = ["//visibility:public"])
load("//tools/install:install.bzl", "install") // build不会自动导入install,需要手动导入


cc_library(
    name = "common_cpt_lib",
    srcs = ["common_cpt.cc"],
    hdrs = ["common_cpt.h"],
    deps = [
            "//cyber",
            "//cyber/demo_base_proto:student_cc"
    ]

)
// 因为实现了cpp文件,所以增加cc_binary,并将其指定为动态库
cc_binary(
    name = "lib_common_cpt.so",
    linkshared = True, // 动态库所以共享链接为true
    linkstatic = False, // 静态链接为false
    deps = [":common_cpt_lib"]
)

filegroup(
    name = "conf",
    // 将dag文件和launch文件打包
    srcs = [
            ":cpt.dag",
            ":cpt.launch"
    ]
)

// 安装dag和launch
install(
    name = "install",
    data = [
            ":conf"
    ],
    runtime_dest = "cyber/demo_cc/component_common01"  // 当前包相对路径
    targets = [
        "//cyber/demo_cc:demo01_talker", // 发布方
        ":lib_common_cpt.so" // 组件的动态库
    ]
)
////////////////////////////////////////////////////////////////////

// bezal build cyber/demo_cc/component_common01/...
// source cyber/setup.bash
// 执行:
/*
    终端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

        关闭组件:
            ctrl + c
            或者
            source cyber/setup.bash
            cyber_launch stop cyber/demo_cc.component_common01/cpt.launch

*/

 

posted @ 2023-07-10 21:04  WTSRUVF  阅读(70)  评论(0)    收藏  举报