【7】ExternalCommand

文章目录

  • ExternalCommandProcessComponent(服务端)
    • 输入
    • 输出
  • external_command_demo(客户端)
  • 插件ActionCommandProcessor

ExternalCommandProcessComponent(服务端)

输入

用户业务模块发送的命令为apollo::external_command::ExternalCommandProcessComponent的输入,用户输入命令通过 apollo::cyber::Client客户端 调用

在每个命令对应的CommandProcessor中创建处理命令的apollo::cyber::Service,service的Response一般都是当前命令处理的状态。

在这里插入图片描述

通过cat /apollo/modules/external_command/process_component/conf/config.pb.txt 可以看到conf配置文件中包含7个服务端处理器。

output_command_status_name: "/apollo/external_command/command_status"
processor: "apollo::external_command::LaneFollowCommandProcessor"
processor: "apollo::external_command::ValetParkingCommandProcessor"
processor: "apollo::external_command::ActionCommandProcessor"
processor: "apollo::external_command::ChassisCommandProcessor"
processor: "apollo::external_command::FreeSpaceCommandProcessor"
processor: "apollo::external_command::PathFollowCommandProcessor"
processor: "apollo::external_command::SpeedCommandProcessor"
c/s
call
/apollo/planning/pad
/apollo/control/pad
ExternalCommandProcessComponent
external_command_demo
ActionCommandProcessor
planning模块
control模块
LaneFollowCommandProcessor
FreeSpaceCommandProcessor _不开源
PathFollowCommandProcessor_不开源
other...
用户交互输入命令
other input
service 名Request类型Response类型描述
/apollo/external_command/actionapollo::external_command::ActionCommandapollo::external_command::CommandStatus流程干预命令,如暂停,启动,切换手动模式等
/apollo/external_command/chassisapollo::external_command::ChassisCommandapollo::external_command::CommandStatus自定义底盘命令(园区)
/apollo/external_command/free_spaceapollo::external_command::FreeSpaceCommandapollo::external_command::CommandStatus指定位姿停车命令(园区)
/apollo/external_command/lane_followapollo::external_command::LaneFollowCommandapollo::external_command::CommandStatus沿道路点对点行驶命令
/apollo/external_command/path_followapollo::external_command::PathFollowCommandapollo::external_command::CommandStatus指定线路行驶命令(园区)
/apollo/external_command/speedapollo::external_command::SpeedCommandapollo::external_command::CommandStatus更改速度命令(园区)
/apollo/external_command/valet_parkingapollo::external_command::ValetParkingCommandapollo::external_command::CommandStatus指定停车位泊车命令

输出

输入外部命令经过预处理,被转换成内部命令发送给planning,control或者canbus模块。被转换成的内部命令以cyber topic的形式发送,有如下几种:

Channel 名类型
描述
/apollo/planning/commandapollo::planning::PlanningCommand具有导航动作的外部命令转换成的内部命令,发送给planning模块
/apollo/routing_responseapollo::routing::RoutingResponse在高精地图上沿车道线点对点行驶的外部命令,预处理时生成的routing线路,用于HMI显示时使用
/apollo/planning/padapollo::planning::PadMessage外部命令ActionCommand转换成的内部命令,发送给planning模块
/apollo/control/padapollo::control::PadMessage外部命令ActionCommand转换成的内部命令,发送给control模块
/apollo/canbus/chassis_controlapollo::external_command::ChassisCommand外部命令ChassisCommand转换成的内部命令,发送给canbus模块

通过代码可以此处ExternalCommandProcessComponent根据conf初始化创建了7个service,配合external_command_demo客户端来使用.

namespace apollo {
namespace external_command {bool ExternalCommandProcessComponent::Init() {// Load the external command processors according to the config.ProcessComponentConfig config;if (!GetProtoConfig(&config)) {AERROR << "Unable to load ExternalCommandProcessComponent conf file: "<< ConfigFilePath();return false;}const auto& plugin_manager = cyber::plugin_manager::PluginManager::Instance();for (const auto& processor_class_name : config.processor()) {command_processors_.emplace_back(plugin_manager->CreateInstance<CommandProcessorBase>(processor_class_name));command_processors_.back()->Init(node_);}command_status_service_ =node_->CreateService<CommandStatusRequest, CommandStatus>(config.output_command_status_name(),[this](const std::shared_ptr<CommandStatusRequest>& request,std::shared_ptr<CommandStatus>& response) {bool is_get_status = false;// Get the command status from command processors.for (const auto& processor : command_processors_) {if (processor->GetCommandStatus(request->command_id(),response.get())) {is_get_status = true;break;}}if (!is_get_status) {response->set_status(CommandStatusType::UNKNOWN);response->set_message("Cannot get the status of command.");}});AINFO << "ExternalCommandProcessComponent init finished.";return true;
}}  // namespace external_command
}  // namespace apollo

external_command_demo(客户端)

syntax = "proto2";package apollo.external_command;import "modules/common_msgs/basic_msgs/header.proto";enum ActionCommandType {// Follow the current lane.FOLLOW = 1;// Change to the laft lane.CHANGE_LEFT = 2;// Change to the right lane.CHANGE_RIGHT = 3;// Pull over and stop driving.PULL_OVER = 4;// Stop driving smoothly in emergency case.STOP = 5;// Start driving after paused.START = 6;// Clear the input planning command to cancel planning.CLEAR_PLANNING = 7;// Switch to manual drive mode.SWITCH_TO_MANUAL = 50;// Switch to auto drive mode.SWITCH_TO_AUTO = 51;// Varify vin code of vehicle.VIN_REQ = 52;// Enter mission modelENTER_MISSION = 53;// Exit mission modelEXIT_MISSION = 54;
}message ActionCommand {optional apollo.common.Header header = 1;// Unique identification for command.optional int64 command_id = 2 [default = -1];// The action command.required ActionCommandType command = 3;
}
类型
描述
pull_overFollow the current lane.
stopStop driving smoothly in emergency case.
startStart driving after paused.
clearClear the input planning command to cancel planning.
manualSwitch to manual drive mode.
autoSwitch to auto drive mode.
vinVarify vin code of vehicle.
enter_missionEnter mission model
exit_missionExit mission model

插件ActionCommandProcessor

modules/external_command/command_processor/action_command_processor

插件的输出为外部操作指令执行后对应发布的channel信息(/apollo/planning/pad 或 /apollo/control/pad)和更新planning模块发布的命令执行状态(CommandStatus):

Channel 名称类型
描述
/apollo/planning/padapollo::planning::PadMessage改变planning场景行为的指令
/apollo/control/padapollo::control::PadMessage改变底盘驾驶模式的指令
/apollo/planning/command_statusapollo::external_command::CommandStatus更新planning模块发布的针对外部命令的执行状态

配置

文件路径类型/结构说明
modules/external_command/command_processor/action_command_processor/conf/config.pb.txtapollo::external_command::CommandProcessorConfig配置文件,外部操作命令处理器输入输出的channel或service名称等信息
modules/external_command/command_processor/action_command_processor/conf/special_config.pb.txtapollo::external_command::ActionCommandConfig配置文件,外部操作命令处理器模块的配置

apollo/modules/external_command/command_processor/action_command_processor/action_command_processor.cc

bool ActionCommandProcessor::Init(const std::shared_ptr<cyber::Node>& node) {...// Create service for input command.command_service_ = node->CreateService<ActionCommand, CommandStatus>(config.input_command_name(),[this](const std::shared_ptr<ActionCommand>& command,std::shared_ptr<CommandStatus>& status) {this->OnCommand(command, status);});// Create writers for output command.CHECK_GT(config.output_command_name().size(), 1);auto message_writer = MessageWriter::Instance();planning_action_writer_ =message_writer->RegisterMessage<apollo::planning::PadMessage>(config.output_command_name().Get(0));control_action_writer_ =message_writer->RegisterMessage<apollo::control::PadMessage>(config.output_command_name().Get(1));// Create reader for input command status.
...return true;
}
void ActionCommandProcessor::OnCommand(const std::shared_ptr<ActionCommand>& command,std::shared_ptr<CommandStatus>& status) {...//switch (command->command()) {// Send "FOLLOW" message to planning.case external_command::ActionCommandType::FOLLOW: {planning::PadMessage planning_message;common::util::FillHeader(module_name, &planning_message);planning_message.set_action(planning::PadMessage::FOLLOW);planning_action_writer_->Write(planning_message);} break;// Send "CHANGE_LEFT" message to planning.case external_command::ActionCommandType::CHANGE_LEFT: {planning::PadMessage planning_message;common::util::FillHeader(module_name, &planning_message);planning_message.set_action(planning::PadMessage::CHANGE_LEFT);planning_action_writer_->Write(planning_message);} break;// Send "CHANGE_RIGHT" message to planning.case external_command::ActionCommandType::CHANGE_RIGHT: {planning::PadMessage planning_message;common::util::FillHeader(module_name, &planning_message);planning_message.set_action(planning::PadMessage::CHANGE_RIGHT);planning_action_writer_->Write(planning_message);} break;// Send "PULL_OVER" message to planning.case external_command::ActionCommandType::PULL_OVER: {planning::PadMessage planning_message;common::util::FillHeader(module_name, &planning_message);planning_message.set_action(planning::PadMessage::PULL_OVER);planning_action_writer_->Write(planning_message);} break;// Send "STOP" message to planning.case external_command::ActionCommandType::STOP: {planning::PadMessage planning_message;common::util::FillHeader(module_name, &planning_message);planning_message.set_action(planning::PadMessage::STOP);planning_action_writer_->Write(planning_message);} break;// Send "CLEAR_PLANNING" message to planning.case external_command::ActionCommandType::CLEAR_PLANNING: {planning::PadMessage planning_message;common::util::FillHeader(module_name, &planning_message);planning_message.set_action(planning::PadMessage::CLEAR_PLANNING);planning_action_writer_->Write(planning_message);status->set_status(CommandStatusType::FINISHED);} break;// Send "START" message to planning.case external_command::ActionCommandType::START: {planning::PadMessage planning_message;common::util::FillHeader(module_name, &planning_message);planning_message.set_action(planning::PadMessage::RESUME_CRUISE);planning_action_writer_->Write(planning_message);} break;// Send "SWITCH_TO_MANUAL" message to control.case external_command::ActionCommandType::SWITCH_TO_MANUAL: {// Use async function to wait for the chassis to be in manual mode.cyber::Async(&ActionCommandProcessor::SwitchToManualMode, this,module_name);} break;// Send "SWITCH_TO_AUTO" message to control.case external_command::ActionCommandType::SWITCH_TO_AUTO: {// Chassis need be switched to manual mode before switch to auto mode.// Use async function to wait for the chassis to be in auto mode.cyber::Async(&ActionCommandProcessor::SwitchToAutoMode, this,module_name);} break;// Send "ENTER_MISSION" message to planning.case external_command::ActionCommandType::ENTER_MISSION: {planning::PadMessage planning_message;common::util::FillHeader(module_name, &planning_message);planning_message.set_action(planning::PadMessage::ENTER_MISSION);planning_action_writer_->Write(planning_message);} break;// Send "EXIT_MISSION" message to planning.case external_command::ActionCommandType::EXIT_MISSION: {planning::PadMessage planning_message;common::util::FillHeader(module_name, &planning_message);planning_message.set_action(planning::PadMessage::EXIT_MISSION);planning_action_writer_->Write(planning_message);} break;... }
}

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

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

相关文章

I2C bus,adaptor,client 在sysfs 的路径定位

i2c bus 路径 struct bus_type i2c_bus_type {.name "i2c",.match i2c_device_match,.probe i2c_device_probe,.remove i2c_device_remove,.shutdown i2c_device_shutdown, }; EXPORT_SYMBOL_GPL(i2c_bus_type);static int __init i2c_init(void) {int re…

使用ref定义响应式数据变量

Ref 使用 Ref 可以方便地创建和管理Vue组件中的响应式数据。例如&#xff0c;如果你有一个计数器组件&#xff0c;你可以使用 Ref 来创建一个响应式的计数器变量&#xff0c;然后在组件内部或外部修改这个变量的值&#xff0c;而不需要手动触发视图更新。 先声明一个变量&…

Adobe Photoshop 2024 v25.5.1 中文激活版下载以及安装方法教程

软件介绍 Adobe Photoshop 2024 v25.5.1 是Adobe公司的最新版图像处理软件&#xff0c;它提供了强大的图像编辑工具和智能自动化功能&#xff0c;包括图像修复、色彩校正和滤镜效果&#xff0c;以满足专业人士和业余爱好者的需求。这款软件还支持矢量图形设计和实时协作&#…

JavaScript之深入对象,详细讲讲构造函数与常见内置构造函数

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;我是前端菜鸟的自我修养&#xff01;今天给大家详细讲讲构造函数与常见内置构造函数&#xff0c;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;原创不易&#xff0c;如果能帮助到带大家&#xff0c;欢迎…

提升效率:快速绘制线框图的技巧

1、什么是线框 线框作为项目开始时的蓝图或示意图&#xff0c;可以帮助我们更清晰地向相关客户呈现相应的程序或网站的框架结构。从更深层次上讲&#xff0c;线框图代表了产品的基本设计布局&#xff0c;承载着界面显示的关键信息&#xff0c;绘制着要开发的应用程序或网站界面…

LeetCode题练习与总结:二叉树的后序遍历--145

一、题目描述 给你一棵二叉树的根节点 root &#xff0c;返回其节点值的 后序遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[3,2,1]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&#xff1a…

AVR晶体管测试仪开源制作与验证

AVR晶体管测试仪开源制作与验证 &#x1f4cd;原项目地址&#xff1a;https://www.mikrocontroller.net/articles/AVR_Transistortester github地址&#xff1a;https://github.com/Mikrocontroller-net/transistortester &#x1f388;EasyEDA项目地址&#xff1a;https://osh…

《数据结构与算法基础 by王卓老师》学习笔记——2.4线性表的顺序表示和实现3

1.线性表的顺序存储表示 2.顺序表示意图 定义变量的时候才会分配空间&#xff0c;光有类型是不分配空间的 3.顺序表的基本操作 增删查三种较难&#xff0c;后面会讲 4.预定义常量和类型 5.算法一&#xff1a;线性表的初始化 6.线性表的几个简单操作 7.算法二&#xff1a;顺序…

快速上手文心一言指令:解锁AI对话新纪元

快速上手文心一言指令 一、引言&#xff1a;文心一言的魅力所在二、准备工作&#xff1a;了解文心一言平台2.1 轻松注册&#xff0c;开启智能对话之旅2.2 深度探索&#xff0c;掌握界面布局奥秘2.2.1 输入框&#xff1a;智慧交流的起点2.2.2 回复区&#xff1a;即时反馈的窗口2…

IT行业入门,如何假期逆袭,实现抢跑

目录 前言 1.IT行业领域分类 2.基础课程预习指南 3.技术学习路线 4.学习资源推荐 结束语 前言 IT&#xff08;信息技术&#xff09;行业是一个非常广泛和多样化的领域&#xff0c;它包括了许多不同的专业领域和职业路径。如果要进军IT行业&#xff0c;我们应该要明确自己…

从一次 SQL 查询的全过程了解 DolphinDB 线程模型

1. 前言 DolphinDB 的线程模型较为复杂&#xff0c;写入与查询分布式表都可能需要多个类型的线程。通过了解 SQL 查询的全过程&#xff0c;可以帮助我们了解 DolphinDB 的线程模型&#xff0c;掌握 DolpinDB 的配置&#xff0c;以及优化系统性能的方法。 本教程以一个分布式 …

【鸿蒙学习笔记】基础组件 Button

官方文档&#xff1a;按钮 (Button)添加链接描述 官方文档&#xff1a;button开发指导 目录标题 属性迭代完善不含子组件的按钮包含子组件的按钮ButtonType添加事件跳转超链接提交表单悬浮按钮 属性迭代完善 不含子组件的按钮 Column({ space: 10 }) {Row() {Button(添加子目…

【原理】随机森林模型是怎么训练的

本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/ 目录 一、随机森林简介二、随机森林训练原理2.1. 随机森林的训练流程2.2. 随机森林训练的核心代码 用过随机森林的朋友都知道&#xff0c;随机森林是集成决策的一个经典代表&#xff0c;它通过训练多棵决策树&#xf…

Zigbee智能家居数据中心:微信小程序实时掌控家居传感器信息

摘要&#xff1a; 本文将介绍如何构建一个基于Zigbee和微信小程序的智能家居网关&#xff0c;实现对家居传感器数据的采集、汇总和展示。用户可通过微信小程序实时查看家中温湿度、光照等环境数据&#xff0c;为智能家居系统提供数据支撑。 关键词&#xff1a; Zigbee&#xf…

java内存管理机制(二)-内存分配

在上一篇文章中&#xff0c;我们花了较大的篇幅去介绍了JVM的运行时数据区&#xff0c;并且重点介绍了栈区的结构及作用&#xff0c;在本文中&#xff0c;我们将主要介绍对象的创建过程及在堆中的分配方式。 对象的创建 在上文我们提过一些问题&#xff0c;你的对象是怎么new…

5.3.3、二维数组案例-考试成绩统计

代码 #include <iostream> using namespace std; #include <string>int main() {//二维数组案例-考试成绩统计//1、创建二维数组int scores[3][3] {{100,100,100},{90,50,100},{60,70,80},};string names[3] { "张三","李四","王五&quo…

基于星火大模型的群聊对话分角色要素提取挑战赛|#AI夏令营#Datawhale#夏令营-Lora微调与prompt构造

赛题连接 https://challenge.xfyun.cn/topic/info?typerole-element-extraction&optionphb Datawhale Al夏令营 零基础入门大模型技术竞赛 数据集预处理 由于赛题官方限定使用了星火大模型&#xff0c;所以只能调用星火大模型的API或者使用零代码微调 首先训练数据很少…

周志华机器学习西瓜书经典来袭!PPT+课件+南瓜书

南京大学教授&#xff0c;博士生导师&#xff0c;教育部“长江学者”特聘教授&#xff0c;国家杰出青年基金获得者&#xff01;周志华老师的头衔太多了&#xff01;相信每一个从事或爱好机器学习的朋友都知道周志华老师&#xff0c;尤其是他的那本经典巨作《机器学习》&#xf…

慧哥Saas充电桩开源平台 V2.5.5

文章目录 原地址&#xff1a;https://gitee.com/chouleng/cdzkjjh&#xff0c;更换新的地址如下 [点击此链接 https://gitee.com/chouleng/huili-cloud](https://gitee.com/chouleng/huili-cloud)一、产品功能部分截图1.手机端&#xff08;小程序、安卓、ios&#xff09;2.PC端…

华为云OBS 通过S3客户端访问

华为云好像没有对S3协议的支持说明其实底层是支持S3协议的。 使用S3的时候我们会需要endpoint&#xff0c;桶名字&#xff0c;region&#xff0c;AWS_ACCESS_KEY,AWS_SECRET_KEY 其中endpoint 就是图片中的&#xff0c;桶名字也很容易找到&#xff0c;region 就是你的endpoint…