【5】apollo编写python节点步骤及实例

news2025/2/21 22:19:35
  1. 在workspace/modules下新建包buildtool create --template component modules/test_one
    在这里插入图片描述

  2. 编译包 buildtool build -p modules/test_two/
    在这里插入图片描述

  3. 增加自己的proto消息
    在刚才自动生成的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 TestTwoMsg {

}

message TestTwoConfig {
  optional string name = 1;
};
// new added
message TestTwoMymessage{
  optional string twoInfo = 1;
}

也可以新建proto文件, 修改BUILD文件;记得重新编译.
proto文件内容如下

syntax = "proto2";
package apollo;

message TestTwoLwlgzy{
  optional string twoInfo = 1;
  optional string twoFault = 2;
}

修改对应BUILF的文件

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 = "test_two_proto",
    srcs = ["test_two.proto"],
)

proto_library(
    name = "test_two_lwlgzy_proto",
    srcs = ["test_two_lwlgzy.proto"],
)
apollo_package()

cpplint()
  1. 生成的pb2文件路径在/opt/apollo/neo/python/modules/test_two/proto
    a). 新建test.py文件加入如下内容 from modules.test_two.proto.test_two_pb2 import TestTwoMymessage
    b). 给运行权限sudo chmod 755 *.py
    运行没有报错即为正常.

本机没有编译or缺少需要引用的proto文件时候, 也可以直接将其他机器生成的pb2.py文件拷贝到类似/opt/apollo/neo/python/xxx/xxx/proto 下import才不会报错.

  1. python 文件中import 路径为from 包名路径.proto.xx_pb2 import xxx. 例如:from modules.test_two.proto.test_two_lwlgzy_pb2 import TestTwoLwlgzy
modules/test_two/
|-- BUILD
|-- conf
|   |-- test_two.conf
|   `-- test_two.pb.txt
|-- cyberfile.xml
|-- dag
|   `-- test_two.dag
|-- launch
|   `-- test_two.launch
|-- proto
|   |-- BUILD
|   |-- test_two.proto
|   `-- test_two_lwlgzy.proto
|-- test.py
|-- test_two_component.cc
`-- test_two_component.h

4 directories, 12 files

  1. 播包cyber_recorder play -f modules/chassis.00000.20210622135417

订阅底盘话题处理故障实例

import time
import asyncio
from datetime import datetime
from cyber.python.cyber_py3 import cyber
from modules.canbus_vehicle.yt.proto.yt_pb2 import Yt
from od_health_test.proto.od_health_test_pb2 import OdErrorInfo, OdErrorMsgs

import logging
from modules.tools.common.logger import Logger
import os

APOLLO_ROOT = "/apollo"

class xxHealthMonitor:

    def __init__(self) -> None:
        self.health_node_ = cyber.Node("xx_health_monitor_node")
        
        Logger.config(
            log_file = os.path.join(APOLLO_ROOT, 'data/log/xx_health.log'),
            use_stdout=True,
            log_level=logging.DEBUG)
        
        self.logger = Logger.get_logger("HealthMonitor")
        self.logger.info("health_monitor_node is started. ")

        self.health_node_.create_reader("/apollo/canbus/chassis_detail",Yt,self._chassis_cb_)
        self.health_writer = self.health_node_.create_writer("/xx/health", OdErrorMsgs)
      
        self.has_data = False
        self.bat_total_voltage = 0
        self.bat_total_current = 0

        self.od_ErrMessages = OdErrorMsgs()
        e_info = OdErrorInfo()
        e_info.err_level = ''
        e_info.err_message = ''
        self.od_ErrMessages.error_msgs.append(e_info)
        
        self.last_data_time = None
       
    # /apollo/canbus/chassis_detail  100hz
    def _chassis_cb_(self,msg):
        self.last_data_time = time.time()
        
       #...解析数据,添加逻辑判断

        
      
    def _padding_fault_msgs(self, level, msg):
         err_info = OdErrorInfo()
         err_info.err_level = level
         err_info.err_message = msg
         self.od_ErrMessages.error_msgs.append(err_info)

    def _error_checking(self):
           pass

    def run(self):
        while not cyber.is_shutdown():
            try:
                current_time = time.time()
                if self.last_data_time is None or (current_time -  self.last_data_time)>1:
                    self.od_ErrMessages = OdErrorMsgs()
                    e_info = OdErrorInfo()
                    e_info.err_level = '1'
                    e_info.err_message = 'No data received from chassis_detail'
                    self.od_ErrMessages.error_msgs.append(e_info)
                    
                    self.health_writer.write(self.od_ErrMessages)

                else:
                    self.od_ErrMessages = OdErrorMsgs()
                    self._error_checking()
                    self.health_writer.write(self.od_ErrMessages)                 
                    # print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))

                self.dump2log()
                
            except Exception as e:
                print("Error:", e)
       
            time.sleep(1) # 1hz
            self.has_data = False

    def dump2log(self):
        dumpMsg = ""
        for oo in self.od_ErrMessages.error_msgs:
            dumpMsg += f"[{oo.err_level}:{oo.err_message}],"
        
        # print(writemsg.strip(','))
        self.logger.info(dumpMsg.strip(','))


if __name__=="__main__":
    cyber.init()
    print("health monitor is starting!")
    health_monitor = OdHealthMonitor()
    health_monitor.run()

    print("health monitor is closing!")
    cyber.shutdown()

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络编程基础知识拾遗:用大白话解释什么是交换机、路由器、光猫、IP地址和子网掩码、公网和内网IP、端口和域名

二层交换机 在没有二层交换机的环境中,两台电脑或多个电脑之间的通信主要依赖于直连方式或共享介质。假如你和你的舍友都有一台电脑,当你们之间想要进行通信的时候,在没有二层交换机的情况下,可以使用网线(为了方便理…

SpringBoot中使用多线程调用异步方法,异步方法有无返回值例子。

快速了解Async注解的用法,包括异步方法无返回值、有返回值,最后总结Async注解失效的几个坑。 在我们的 SpringBoot 应用中,经常会遇到在一个接口中,同时做事情1,事情2,事情3,如果同步执行的话&a…

发电机保护屏产品介绍,组成

发电机保护屏产品介绍,组成 发电机保护屏是用于保护发电机组的电气装置。它根据发电机的类型和实际运行要求,将多种保护装置组合在一起,形成一个保护屏柜。发电机保护测控屏是指把发电机类保护装置集中在安装在一个控制柜里,主要用…

【软件下载】Folx详细安装教程视频-Folx软件最新版下载

根据大数据调查表明Acceleration PRO下载:抽出多达10个流的故障能够显着提高下载速度。根据行业数据显示与iTunes PRO集成:通过将Folx集成到iTunes来下载歌曲和视频,能够在下载后立即自动添加到iTunes库。实际上我们可以这样讲通过代理下载&a…

LabVIEW遇到无法控制国外设备时怎么办

当使用LabVIEW遇到无法控制国外产品的问题时,解决此类问题需要系统化的分析和处理方法。以下是详细的解决思路和具体办法,以及不同方法的分析和比较,包括寻求代理、国外技术支持、国内用过的人请教等内容。 1. 了解产品的通信接口和协议 思路…

小型海外仓布局策略:高效利用有限空间,标准化3F流程

合理高效的仓库空间设计,不只是对大型海外仓很关键。对空间有限的小型海外仓来说或许价值更大。 本身仓储空间就有限,如果还没有科学规划,造成空间浪费,那将直接影响到核心业务的运转。 今天我们就给大家整理了对小型海外仓布局…

制作一个智能体:抖音热点话题文案制作助手

文章目录 第一步,添加助手第二步,选择语聚GPT第三步,填写相关信息第四步,工具中选择抖音(普通号)第五步,选择“查询热门视频数据”第六步,测试总结 这篇文章,我们手把手的演示开发一个智能体&am…

Mysql回表和覆盖索引

一、简述 回表,顾名思义就是回到表中,也就是先通过普通索引扫描出数据所在的行,再通过行主键ID 取出索引中未包含的数据。所以回表的产生也是需要一定条件的,如果一次索引查询就能获得所有的select 记录就不需要回表,…

LLM文本数据集775TB:覆盖32个领域,444个数据集

大语言模型在各领域展现出巨大潜力,其性能在很大程度上依赖于训练和测试所用的数据集。然而,目前在如何构建和优化这些数据集方面,尚缺乏统一的认识和方法论。下面从五个方面整合和分类了LLM数据集的基本内容:预训练语料库、指令微…

在低版本Excel中创建次级下拉列表

在低版本中indirect函数不支持选区,创建次级下拉列表得依靠“名称管理”给选区命名。 (笔记模板由python脚本于2024年06月26日 06:24:22创建,本篇笔记适合常用Excel处理数据的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www…

数据库系统概论(第5版教材)

第一章 绪论 1、数据(Data)是描述事物的符号记录; 2、数据库系统的构成:数据库 、数据库管理系统(及其开发工具) 、应用程序和数据库管理员; 3、数据库是长期存储在计算机内、有组织、可共享的大量数据的集合&…

linux应用开发基础知识(七)——管道和消息队列进程通信

管道通信 匿名管道 #include <unistd.h> int pipe(int pfd[2]);pfd[0]用于读管道&#xff0c;而pdf[1]用于写管道。 注意&#xff1a;匿名管道只能用于亲缘关系的进程之间通信。管道通道是单向的&#xff0c;一边读&#xff0c;另一边写。管道可以用于大于两个进程共…

基线核查--渗透

基线检查 基线核查概念 it中定义&#xff1a; 基线为初始的标准&#xff0c;以后更改就要经过授权&#xff0c;形成下一基线。 软件配置管理的基线&#xff1a;1功能基线&#xff0c;分配基线&#xff0c;产品基线 安全配置基线--基线核查 安全基线可以说是木桶理论&…

Dubbo运行原理

目录 Dubbo通讯协议 Dubbo负载均衡策略 RPC和HTTP有什么区别&#xff1f; 让你设计一个RPC框架&#xff0c;如何考虑数据序列化问题&#xff1f; Dubbo 是一款高性能、轻量级的开源 RPC&#xff08;远程过程调用&#xff09;框架&#xff0c;主要用于构建分布式服务和微服务…

为什么 Uvicorn 的性能不如 uWSGI?你真的用对了吗?

Uvicorn 简介 Uvicorn 是一个基于 ASGI 的快速 Web 服务器,号称性能赶超 uWSGI。然而,有些人在实际使用中发现 Uvicorn 的性能不如 uWSGI。那么,Uvicorn 真的不如 uWSGI 吗?其实,问题可能出在使用方法上。 Uvicorn 是否真的不如 uWSGI 首先,我们需要了解 Uvicorn 和 uW…

无源电压继电器 JDY-1210AW 导轨安装 约瑟JOSEF

系列型号&#xff1a; JDY-1002AW电压继电器&#xff1b;JDY-1002B电压继电器&#xff1b; JDY-1110AW电压继电器&#xff1b;JDY-1110B电压继电器&#xff1b; JDY-1220AW电压继电器&#xff1b;JDY-1220B电压继电器&#xff1b; JDY-1100AW电压继电器&#xff1b;JDY-110…

浅谈业务开发与非业务开发

浅谈业务开发与非业务开发 软件开发业务开发非业务开发工作量的区别 软件开发 在谈及业务开发与非业务开发之前&#xff0c;首先他们都是软件开发&#xff0c;那么软件开发的流程是怎样的呢&#xff1f;我们先来了解一下软件开发的流程。通常情况下软件开发的流程是这样的 在…

Python中20个鲜为人知的字符串函数

目录 1. capitalize() 2. casefold() 3. join() 和 split() 4. strip(), lstrip(), rstrip() 5. replace() 6. format() 7. enumerate() 8. isalpha(), isdigit(), isalnum() 9. startswith(), endswith() 10. center() 11. count() 12. find(), index() 13. make…

【SQL】数据操作语言(DML) - 删除数据:精细管理数据的利刃

目录 前言 DELETE语句的基础使用 删除指定记录 清空表与删除表数据的区别 注意 前言 在数据库管理的日常工作中&#xff0c;数据的删除是一项需要格外小心的操作&#xff0c;因为一旦数据被删除&#xff0c;往往难以恢复。数据操作语言(DML)中的DELETE语句&am…

MFC---静态文本框和编辑框Edit Control(控件的通知消息)(常用控件)

上一节讲了颜色对话框之后&#xff0c;关于对话框的使用和各种通用对话框的介绍就到此为止了。从本节开始将讲解各种常用控件的用法。常用控件主要包括&#xff1a;静态文本框、编辑框、单选按钮、复选框、分组框、列表框、组合框、图片控件、列表控件、树形控件和进度条控件等…