Cyber RT 之 Timer Component 实践(apollo 9.0)

实验内容

Component 是 Cyber RT 提供的用来构建功能模块的基础类,Component 有两种类型,分别为 Component 和 TimerComponent。

相较于 Component,TimerComponent 不提供消息融合,也不由消息触发运行,而是由系统定时调用,可用来执行一些例行任务。

本实验将编写一个 TimerComponent 实例,来模拟传感器产生数据。

实验流程

创建TimerComponent模板实例

进入apollo容器,终端执行以下命令,创建实验代码目录

buildtool create --template timer_component component/timer_component_sensor

最终生成component目录,其目录结构如下:

./component/
`-- timer_component_sensor|-- BUILD|-- conf|   |-- timer_component_sensor.conf|   `-- timer_component_sensor.pb.txt|-- cyberfile.xml|-- dag|   `-- timer_component_sensor.dag|-- launch|   `-- timer_component_sensor.launch|-- proto|   |-- BUILD|   `-- timer_component_sensor.proto|-- timer_component_sensor_component.cc`-- timer_component_sensor_component.h
  • BUILD 文件为 TimerComponent 的源码编译的规则文件
  • conf 目录下
    • timer_component_sensor.conf为全局变量配置文件
    • timer_component_sensor.pb.txt为用户在 proto 文件中定义的可配置项的配置文件
    • cyberfile.xmltimer_component_sensor功能包的描述文件
    • dag 目录下的timer_component_sensor.dag文件中描述了timer_component_sensor功能包的依赖关系
  • launch 文件夹下
    • timer_component_sensor.launchtimer_component_sensor功能包的 launch 启动文件
  • proto 文件夹下的
    • BUILD 为用户在 proto 文件夹下定义的 protobuffer 文件的编译规则文件
    • timer_component_sensor.proto文件中用户可以定义自己的消息结构
    • timer_component_sensor.cctimer_component_sensor.h两个文件为 TimerComponent 的源文件和头文件。

定义消息结构 

timer_component_sensor.proto中,添加以下消息数据结构。

syntax = "proto2";package apollo;// message type of channel, just a placeholder for demo,
// you should use `--channel_message_type` option to specify the real message type
//定义相机传感器的消息结构
message CameraSensorMsg {optional string content =1;//消息内容optional uint64 msg_id =2;//消息idoptional uint64 timestamp=3;//发送消息的时间戳
}//定义激光雷达传感器的消息结构
message LidarSensorMsg {optional string content =1;//消息内容optional uint64 msg_id =2;//消息idoptional uint64 timestamp=3;//发送消息的时间戳
}//配置TimerComponentSensorConfig的名称和输出数据的channel
message TimerComponentSensorConfig {optional string camera_name = 1;optional string camera_sensor_topic=2;optional string lidar_name=3;optional string lidar_sensor_topic=4;
};

 在 proto 文件夹下的 BUILD 文件中,添加 protobuffer 文件的编译规则。

load("//tools:apollo_package.bzl", "apollo_package")
load("//tools/proto:proto.bzl", "proto_library")
load("//tools:cpplint.bzl", "cpplint")package(default_visibility = ["//visibility:public"])proto_library(name = "timer_component_sensor_proto",srcs = ["timer_component_sensor.proto"],
)apollo_package()cpplint()

 配置TimerComponent的配置文件

timer_component_sensor.pb.txt中,配置timer_component_sensor.proto文件中定义的可配置项。

camera_name: "camera-sensor"
camera_sensor_topic: "/sensor/camera"lidar_name: "lidar-sensor"
lidar_sensor_topic: "/sensor/lidar"

编写TimerComponent的源文件

修改timer_component_sensor.h文件:

/******************************************************************************* Copyright 2023 The Apollo Authors. All Rights Reserved.** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*****************************************************************************//******************************************************************************* @file timer_component_sensor_component.h*****************************************************************************/#pragma once
#include <memory>#include "cyber/common/macros.h"
#include "cyber/component/component.h"
#include "cyber/component/timer_component.h"
#include "cyber/cyber.h"
#include "component/timer_component_sensor/proto/timer_component_sensor.pb.h"using apollo::cyber::Time;
using apollo::cyber::Writer;namespace apollo {class TimerComponentSensor final: public apollo::cyber::TimerComponent {public:bool Init() override;bool Proc() override;private:apollo::TimerComponentSensorConfig config_;//定义camera的消息writerstd::shared_ptr<Writer<CameraSensorMsg>> camera_sensor_writer_=nullptr;//定义lidar的消息writerstd::shared_ptr<Writer<LidarSensorMsg>> lidar_sensor_writer_=nullptr;
};CYBER_REGISTER_COMPONENT(TimerComponentSensor)} // namespace apollo

修改timer_component_sensor.cc`文件。

/******************************************************************************* Copyright 2023 The Apollo Authors. All Rights Reserved.** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*****************************************************************************//******************************************************************************* @file timer_component_sensor_component.cc*****************************************************************************/#include "component/timer_component_sensor/timer_component_sensor_component.h"namespace apollo {bool TimerComponentSensor::Init() {ACHECK(ComponentBase::GetProtoConfig(&config_))<< "failed to load timer_component_sensor config file "<< ComponentBase::ConfigFilePath();AINFO << "Load config succedded.\n" << config_.DebugString();//创建camera和lidar的writercamera_sensor_writer_=node_->CreateWriter<CameraSensorMsg>(config_.camera_sensor_topic().c_str());lidar_sensor_writer_=node_->CreateWriter<LidarSensorMsg> (config_.lidar_sensor_topic().c_str());AINFO << "Init TimerComponentSensor succedded.";return true;
}bool TimerComponentSensor::Proc() {AINFO << "Proc TimerComponentSensor triggered.";//封装camera消息static int i=0;auto camera_out_msg=std::make_shared<CameraSensorMsg>();camera_out_msg->set_msg_id(++i);camera_out_msg->set_content(config_.camera_name());camera_out_msg->set_timestamp(Time::Now().ToNanosecond());//将camera消息写入通道camera_sensor_writer_->Write(camera_out_msg);//封装lidar消息auto lidar_out_msg=std::make_shared<LidarSensorMsg>();lidar_out_msg->set_msg_id(++i);lidar_out_msg->set_content(config_.lidar_name());lidar_out_msg->set_timestamp(Time::Now().ToNanosecond());//写入lidar消息lidar_sensor_writer_->Write(lidar_out_msg);return true;
}} // namespace apollo

修改 BUILD 文件

load("//tools:apollo_package.bzl", "apollo_cc_library", "apollo_cc_binary", "apollo_package", "apollo_component")
load("//tools:cpplint.bzl", "cpplint")package(default_visibility = ["//visibility:public"])filegroup(name = "timer_component_sensor_files",srcs = glob(["dag/**","launch/**","conf/**",]),
)apollo_component(name = "libtimer_component_sensor_component.so",srcs = ["timer_component_sensor_component.cc",],hdrs = ["timer_component_sensor_component.h",],linkstatic = True,deps = ["//cyber","//component/timer_component_sensor/proto:timer_component_sensor_proto",],
)apollo_package()cpplint()

编译TimerComponent功能包

在终端中,执行以下指令,编译 timer_component_sensor 功能包。

root@in-dev-docker:/apollo_workspace# buildtool build  -p component/timer_component_sensor/

出现如下信息即为编译成功

修改启动配置

修改TimerComponent的dag文件

timer_component_sensor.dag文件中,将 interval 项的值改为 500,即每 500ms 运行一次。interval 值为 TimerComponent 的运行时间间隔。

module_config {module_library : "component/timer_component_sensor/libtimer_component_sensor_component.so"timer_components {class_name : "TimerComponentSensor"config {name: "timer_component_sensor"config_file_path:  "component/timer_component_sensor/conf/timer_component_sensor.pb.txt"flag_file_path:  "component/timer_component_sensor/conf/timer_component_sensor.conf"interval: 500}}
}

修改TimerComponent的launch文件

在<dag_conf>标签内的 dag 文件路径前加上“ ./ ” 。由于目前 cyber 与 apollo 绑定的比较紧密,编译完成后,系统会把编译产出及配置文件拷贝到 apollo 相应目录下,且执行文件时,系统会优先执行 apollo 目录下的文件,这样就会导致此处的配置无法起作用,这里加上“ ./ ”,就是告诉系统使用此处的 dag 文件来运行 component。

<cyber><module><name>communication</name><dag_conf>./communication/dag/communication.dag</dag_conf><process_name>communication</process_name></module>
</cyber>

运行TimerComponent

方式一:使用mainboard运行timer_component_sensor.dag文件

在终端中,输入以下指令,使用 mainboard 工具运行timer_component_sensor.dag文件,运行timer_component_sensor功能包。

mainboard -d ./component/timer_component_sensor/dag/timer_component_sensor.dag

方式二:使用cyber_launch运行timer_component_sensor.launch文件

在终端中,也可以使用 cyber_launch 工具运行timer_component_sensor.launch文件,运行timer_component_sensor功能包。

查看TimerComponent运行结果 

使用cyber_monitor工具查看timer_component_sensor运行结果。

新启一个终端窗口,在终端中输入执行 cyber_monitor 命令,启动cyber_monitor工具。

cyber_monitor

参考:

apollo.baidu.com/community/Apollo-Homepage-Document?doc=BYFxAcGcC4HpYIbgPYBtXIHQCMEEsATAV0wGNkBbWA5UyRFdZWVBEAU0hFgoIH0adPgCY%2BADwCiAVnEBBCeIAcATnETFcgMxKZkgGxKAwkoDsa3YoAi45WdGSLxsYt0SzY%2BXICMa98oAMSgYALF7%2B2NhemsLBJsrCYZqKwors7AikBIp6miYmpFJSXpigFKhAA

Apollo开发者社区_cyber专项课(9.0版)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/452744.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

进入 Searing-66 火焰星球:第一周游戏指南

Alpha 第四季已开启&#xff0c;穿越火焰星球 Searing-66&#xff0c;带你开启火热征程。准备好勇闯炙热的沙漠&#xff0c;那里有无情的高温和无情的挑战在等待着你。从高风险的烹饪对决到炙热的冒险&#xff0c;Searing-66 将把你的耐力推向极限。带上充足的水&#xff0c;天…

AI开发-三方库-Hugging Face-Pipelines

1 需求 需求1&#xff1a;pipeline支持的任务类型 需求2&#xff1a;推理加速使用CPU还是GPU 需求3&#xff1a;基于pipeline的文本分类示例 需求4&#xff1a;pipeline实现原理 模型使用步骤&#xff08;Raw text -》Input IDs -》Logits -》Predictions&#xff09;&…

ZK集群搭建:详细步骤与注意事项

在大数据和分布式系统日益重要的今天&#xff0c;ZooKeeper&#xff08;简称ZK&#xff09;作为一种分布式协调服务&#xff0c;扮演着举足轻重的角色。它主要用于管理大型分布式系统中的配置信息、命名、同步等。下面将详细介绍如何搭建一个ZooKeeper集群&#xff0c;帮助大家…

【RabbitMQ】RabbitMQ 的七种工作模式介绍

目录 1. Simple(简单模式) 2. Work Queue(工作队列) 3. Publish/Subscribe(发布/订阅) 4. Routing(路由模式) 5. Topics(通配符模式) 6. RPC(RPC通信) 7. Publisher Confirms(发布确认) 上一篇文章中我们简单认识了RabbitM1: 【RabbitMQ】RabbitMQ 的概念以及使用Rabb…

面试官-HashMap的容量为什么一定是2^n?

嗨&#xff0c;我是大明哥&#xff0c;一个专注「死磕 Java」系列创作的硬核程序员。 回答 HashMap 的容量被设计为 2^n&#xff0c;主要有如下几个优势&#xff1a; 位运算效率&#xff1a;与使用取模&#xff08;%&#xff09;操作相比&#xff0c;使用位运算来计算索引位置…

用Spring AI 做智能客服,基于私有知识库和RAG技术

Java智能客服系统运用RAG技术提升答疑精准度 基于Spring ai 的 RAG&#xff08;检索增强生成&#xff09;技术&#xff0c;Java智能客服系统能够利用私有知识库中的信息提供更准确的答疑服务。 它的核心思路是&#xff1a; 首先&#xff0c;将客服QA以Word形式导入到系统中&…

upload-labs Pass-04

upload-labs Pass-04 在进行测试前&#xff0c;先了解一下.htaccess文件 .htaccess文件 .htaccess是Apache网络服务器一个配置文件&#xff0c;当.htaccess文件被放置在一个通过Apache Web服务器加载的目录中&#xff0c;.htaccess文件会被Apache Web服务器软件检测并执行&…

深度学习 之 模型部署 使用Flask和PyTorch构建图像分类Web服务

引言 随着深度学习的发展&#xff0c;图像分类已成为一项基础的技术&#xff0c;被广泛应用于各种场景之中。本文将介绍如何使用Flask框架和PyTorch库来构建一个简单的图像分类Web服务。通过这个服务&#xff0c;用户可以通过HTTP POST请求上传花朵图片&#xff0c;然后由后端…

【大数据技术基础 | 实验四】HDFS实验:读写HDFS文件

文章目录 一、实验目的二、实验要求三、实验原理&#xff08;一&#xff09;Java Classpath&#xff08;二&#xff09;Eclipse Hadoop插件 四、实验环境五、实验内容和步骤&#xff08;一&#xff09;配置master服务器classpath&#xff08;二&#xff09;使用master服务器编写…

D42【python 接口自动化学习】- python基础之函数

day42 高阶函数 学习日期&#xff1a;20241019 学习目标&#xff1a;函数&#xfe63;- 55 高阶函数&#xff1a;函数对象与函数调用的用法区别 学习笔记&#xff1a; 函数对象和函数调用 # 函数对象和函数调用 def foo():print(foo display)# 函数对象 a foo print(a) # &…

influxdb安装

官网&#xff1a; https://www.influxdata.com/ centos7安装 wget https://dl.influxdata.com/influxdb/releases/influxdb2-2.0.4.x86_64.rpmyum localinstall influxdb2-2.0.4.x86_64.rpm启动 systemctl start influxdb systemctl enable influxdb # netstat -npult |gre…

Springboot指定扫描路径

方式一&#xff1a;通过在启动类的SpringbootApplication中指定包扫描或类扫描 指定需要扫描的包 scanBasePackages{"待扫描包1","待扫描包2", . . . ," "} 指定需要扫描的类 scanBasePackageClasses{类1.class,类2.class,...} 方式二&#xff…

权限(补充)

在上一篇Linux权限&#xff08;想了解的可以点击看看哦&#xff09;中已经见识了一部分权限&#xff0c;但是少了很重要的一部分&#xff1a; 那就是用户之间的转换&#xff0c;文件读写的关系&#xff0c;这里就简单的介绍一些&#xff1b; 我们在Linux权限知道了目录权限的关…

sql数据库命令行操作(数据库的创建和删除)

查询数据库 查询电脑里面所有数据库 SHOW DATABASES;查询当前所处的数据库 SELECT DATABASE();应用场景&#xff1a;当我使用了USE命令后不知道自己所在哪个数据库时&#xff0c;可以使用这个命令查询自己所在数据库 创建数据库 创建 CREATE DATABASE [IF NOT EXISTS] 数据…

StarTowerChain:开启去中心化创新篇章

官网&#xff1a; www.startower.fr 在当今创新驱动的时代&#xff0c;StarTowerChain 以其独特的去中心化创新模式&#xff0c;为我们带来了新的希望和机遇。去中心化&#xff0c;这个充满活力与创造力的理念&#xff0c;正引领着我们走向未来的创新之路。 StarTowerChain …

远程连接服务器

linux客户端通过秘钥登录linux服务端root用户 [rootClient ~]# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): // 存放文件&#xff0c;若直接回车就存在括号文件中&#xff09; Enter passphrase (empty f…

SpringCloudAlibaba[Nacos]注册配置中心注册与发现服务

Nacos的全称是Dynamic Naming and Configuration Service&#xff0c;Na为naming/nameServer即注册中心,co为configuration即注册中心&#xff0c;service是指该注册/配置中心都是以服务为核心。是阿里巴巴开源易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nac…

基于预测算法的航班离港延误系统

毕业设计不知道做什么&#xff1f;想找一个结合算法与应用的项目&#xff1f;那你绝对不能错过这个"基于预测算法的航班离港延误系统"&#xff01;✈️&#x1f4ca; 项目简介&#xff1a; 这个系统专注于航班离港的延误预测&#xff0c;通过强大的神经网络技术对大…

2024软考网络工程师笔记 - 第4章.局域网和城域网

文章目录 局域网基础1️⃣局域网和城域网体系架构 IEEE&#xff08;负责链路层&#xff09;2️⃣局域网拓扑结构 &#x1f551;CSMA/CD1️⃣CSMA/CD2️⃣CSMA/CD三种监听算法3️⃣冲突检测原理 &#x1f552;二进制指数退避算法1️⃣ 二进制指数退避算法 &#x1f553;最小帧长…

IO进程---day5

1、使用有名管道实现两个进程之间的相互通信 //管道文件 #include<myhead.h> int main(int argc, const char *argv[]) {//创建有名管道文件1if(mkfifo("./pipe1",0664)-1){perror("创建管道文件失败");return 0;}if(mkfifo("./pipe2",066…