调度系统和小车关系(下)
调度系统和小车关系(下)六.多个任务调度1.多个动作执行blockingType允许自动行驶允许其他动作并行NONE是是SINGLE是否SOFT否是HARD否否动作的状态状态是否已经结束RUNNING否PAUSED否RETRIABLE否仍等待重试或其他处理FINISHED是FAILED是2.重试机制RETRIABLE:当小车可以重试时当发生了失败可以向MQTT中instantActions的发送报文为{ actions: [ { actionType: retry, actionId: retry-001, blockingType: NONE, actionParameters: [ { key: actionId, value: pick-001 } ] } ] }其中actionParameters里面表示的是这个重试动作的具体参数 。发送的即使动作有retry和skipRetry其中里面的skipRetry的小车状态就会处于失败的状态而不是伪装成成功 。3.区域调度器通过订阅小车的vda5050/v3/DemoRobot/AGV002/state让调度器读取小车的区域分布 。小车通过订阅调度器的vda5050/v3/DemoRobot/AGV002/responses让小车知道调度器给了他权限。区域类型含义车辆应怎样处理BLOCKED禁入区域不得进入SPEED_LIMIT限速区域遵守区域限速RELEASE需要许可的区域取得有效许可后才能进入区域进行申请的时候回复含义尚未进入的车辆能否据此进入GRANTED批准许可有效且其他条件满足时可以QUEUED已收到正在排队处理不可以REJECTED拒绝不可以REVOKED撤销之前的许可不可以区域是由zoneSets组成的:一张地图 └─ 一个启用的区域集 ├─ 禁入区 ├─ 限速区 └─ 需要许可的通道如果车辆已经在RELEASE区域里面许可过期后要按照该区域的releaseLossBehavior配置处理。 不是一律停车也不是一律继续走。配置值车辆怎么处理STOP停止报告RELEASE_LOST等级为CRITICALCONTINUE继续按路径执行保留区域请求信息如果订单在区域内结束就等待新订单EVACUATE执行车辆定义的退出区域行为保留相关请求信息直到离开区域4.地图与区域集当地图更新的时候地图下载流程调度系统 │ │ instantActionsdownloadMap │ 带地图编号、版本、下载地址 ↓ 小车 ──主动下载──→ 地图文件服务器此时返回的states是{ maps: [ { mapId: floor-1, mapVersion: 1.0, mapStatus: ENABLED }, { mapId: floor-1, mapVersion: 2.0, mapStatus: DISABLED } ] }表示下载完成然后再通过调度器更新一个即刻动作{ actionType: enableMap, actionId: enable-map-001, blockingType: NONE, actionParameters: [ { key: mapId, value: floor-1 }, { key: mapVersion, value: 2.0 } ] }用来更新 。同一个 mapId同一时刻最多启用一个版本。注意旧版本只是被禁用仍然保存在车辆中并不等于被删除。initializePosition用于在不同map上找到当前小车的定位 。多个区域重叠的情况禁入优先、限速取低、多个许可都要获得、不同约束通常要同时满足特殊组合查协议表不能自行猜测。5.轨迹与走廊概念回答的问题edge边从哪个节点连接到哪个节点trajectory轨迹两个节点之间具体沿什么路径走corridor走廊允许在轨迹周围什么范围内偏离以下就是轨迹左侧边界 ───────────────────── ↗ 绕行 ↘ 原轨迹 A ────── 障碍物 ───── B 右侧边界 ─────────────────────在判定车辆是否超出走廊不同的参考标准值检查对象KINEMATIC_CENTER车辆运动学中心CONTOUR车辆轮廓包括载荷带来的范围6.visualization 与计划路径调度器的订阅为vda5050/v3/DemoRobot/AGV002/visualization能够监控界面上让小车图标移动得比较流畅可能需要更频繁地更新位置。他与state的区别消息主要用途state反映车辆、订单和动作等业务状态visualization支持较高频率的位置与路径更新其中的报文中的主要内容有字段含义mobileRobotPosition当前车辆位置velocity当前车辆坐标系中的速度plannedPath车辆规划的较长路径intermediatePath车辆近期路径及预计到达时间referenceStateHeaderId这条可视化消息所关联的state消息编号针对关键词再次解释对比plannedPathintermediatePath主要关注较长路径怎样走近期怎样走、预计何时到数据形式NURBS 曲线折线上的路点起点当前车辆位置当前车辆位置是不是历史轨迹不是不是七. 完整报文与三层校验三层校验的流程图为MQTT 收到消息 ↓ 解析 JSON ↓ 检查报文结构 ↓ 检查协议规则、车辆能力和当前状态 ↓ 接受订单更新内部任务 ↓ 通过 state 反馈执行情况1. JSON 语法检查内容JSONPython字符串使用双引号单引号、双引号都可以真trueTrue假falseFalse空值nullNone注释不支持可以使用#最后一个元素后的逗号不允许通常允许在python和JSON格式换中有特定的包Python 字典 │ json.dumps() ↓ JSON 文本 │ MQTT 传输 ↓ JSON 文本 │ json.loads() ↓ Python 字典2.报文结构检查检查报文内容是否符合VDA 5050 协议的内容如订单报文就{ headerId: 1, timestamp: 2026-09-23T02:00:00.000Z, version: 3.0.0, manufacturer: DemoRobot, serialNumber: AGV002, orderId: move-001, orderUpdateId: 0, nodes: [ { nodeId: A, sequenceId: 0, released: true, nodePosition: { x: 0.0, y: 0.0, mapId: floor-1 }, actions: [] }, { nodeId: B, sequenceId: 2, released: true, nodePosition: { x: 5.0, y: 0.0, mapId: floor-1 }, actions: [ { actionType: pick, actionId: pick-001, blockingType: HARD } ] } ], edges: [ { edgeId: AB, sequenceId: 1, released: true, actions: [] } ] }保证每一个类别都对应的是哪一种属性写法含义type: object最外层必须是对象required: [...]这些字段必须出现type: string字段值必须是字符串type: integer字段值必须是整数minimum: 0不允许小于零3. 协议语义和业务检查这一层主要是为了解决业务逻辑层的合理性 。检查组需要哪些信息示例订单自身的一致性当前收到的订单路线序号是否连续、放行关系是否合理与车辆上下文的一致性订单车辆状态能力是否有其他活动订单、地图是否可用、是否支持取货所以总的伪代码应该为def handle_order_message(payload, robot_context): # 第一层解析 candidate parse_json(payload) # 第二层字段与类型 validate_structure(candidate) # 第三层订单关系、车辆能力、当前状态 decision evaluate_order(candidate, robot_context) if decision.is_duplicate: return # 保持当前任务不重复执行 if decision.is_rejected: report_rejection(decision) return # 确认接受之后再更新当前任务 commit_order(candidate, robot_context) publish_state()八. State 与完成判定停止行驶、路线走完、动作结束、车辆空闲、任务成功是五个不同的判断。判断实际在问什么主要观察内容停止行驶小车现在有没有行驶driving路线走完当前订单还有没有待经过的节点和边nodeStates、edgeStates订单动作结束是否还有未结束的订单动作actionStates协议意义上的空闲是否满足订单层面的空闲条件剩余路线订单动作状态业务任务成功这次取货、运输或放货是否实现目标订单进度必要动作结果业务记录当执行完了动作任务的时候并不会把它从action中剔出来而是改为finished针对state进行的判断为① 这是哪辆车的状态消息是否足够新 ↓ ② 对应哪个订单、哪个更新版本 ↓ ③ 路线进度到哪里了 ↓ ④ 必要动作分别是什么状态 ↓ ⑤ 是否暂停、报错或等待许可 ↓ ⑥ 结合调度保存的任务记录更新业务结果九.动作执行状态机状态直观理解是否终态WAITING已收到等待执行否INITIALIZING正在做执行前准备否RUNNING正在执行否PAUSED执行暂时暂停否RETRIABLE本次尝试失败等待重试或其他处理否FINISHED成功结束是FAILED失败结束是十.异常与控制权切换发生故障或者有人接管小车以后调度还能发什么指令原订单是否保留恢复后应该继续还是重新安排情况重点观察调度主动暂停paused车辆发生故障errors人员接管车辆operatingMode等待后续放行剩余路线与released任务已经结束路线、动作和业务结果错误等级划分为等级处理紧迫程度对执行的主要影响WARNING通常不要求立即处理可以继续当前订单URGENT需要立即关注仍可以继续当前订单CRITICAL需要立即处理当前订单无法继续应停止行驶仍具备接收新订单的可能FATAL需要人员介入不能继续行驶也不能接受新订单当发生错误的时候会从state中返回:{ orderId: transport-001, errors: [ { errorType: OTHER_ORDER_ACTIVE, errorLevel: WARNING, errorReferences: [ { referenceKey: orderId, referenceValue: transport-002 } ], errorDescription: 已有活动订单无法接受新订单 } ] }内容含义最外层orderId车辆仍持有transport-001errorType新订单与当前活动订单冲突errorReferences被拒绝的是transport-002errorDescription给人员阅读的说明运行模式场景一人工短暂介入然后继续原任务原任务仍然存在 ↓ 车辆当前由人员介入控制 ↓ 暂不按正常自动执行来推进判断 ↓ 继续观察位置、动作和模式 State返回的是 { operatingMode: INTERVENED, orderId: transport-001, orderUpdateId: 0 }场景二进入手动模式原任务被清除#State返回的是 { operatingMode: MANUAL, orderId: transport-001, orderUpdateId: 0, nodeStates: [], edgeStates: [], actionStates: [ { actionId: pick-001, actionStatus: FINISHED }, { actionId: drop-001, actionStatus: FAILED } ] }路线数组为空。两个动作都已终结。但运输没有正常完成。车辆仍处于手动模式。因此对于错误我们的流程一般是收到异常状态 ↓ 识别影响对象消息、动作、订单还是车辆 ↓ 检查当前控制权限 ↓ 保留已确认的执行事实 ↓ 选择允许的恢复措施 ↓ 等待后续 state 验证结果十一. 断线与状态同步消息没有送到或者双方暂时失去联系以后怎样避免重复执行、错误更新和错误判断任务完成机制解决的问题不能代替什么QoSMQTT 消息交付语义订单接受和业务成功判断retain为后来的订阅者提供该 Topic 的保留消息完整历史和任务数据库Last Will异常断连后由 Broker 发布预设消息车辆实际停止位置与任务结果重连后的流程为恢复 MQTT 连接和订阅 ↓ 获取新的有效 state ↓ 核对车辆身份、模式和错误 ↓ 核对 orderId、orderUpdateId ↓ 核对位置、剩余路线和动作结果 ↓ 决定继续、重发、取消或重新安排

相关新闻

Dopamine 指标扩展指南:add_collector 注册自定义 Collector 详解

Dopamine 指标扩展指南:add_collector 注册自定义 Collector 详解

Dopamine 指标扩展指南:add_collector 注册自定义 Collector 详解 【免费下载链接】dopamine Dopamine is a research framework for fast prototyping of reinforcement learning algorithms. 项目地址: https://gitcode.com/gh_mirrors/do/dopamine Dopam…

2026/9/24 16:52:01 阅读更多 →
深入理解 Humanizer 的 ByteSizeUnitSystem:显式字节单位体系的解析与格式化指南

深入理解 Humanizer 的 ByteSizeUnitSystem:显式字节单位体系的解析与格式化指南

深入理解 Humanizer 的 ByteSizeUnitSystem:显式字节单位体系的解析与格式化指南 【免费下载链接】Humanizer Humanizer meets all your .NET needs for manipulating and displaying strings, enums, dates, times, timespans, numbers and quantities 项目地址:…

2026/9/24 16:52:01 阅读更多 →
Axure 9.0 使用动态面板实现 Tab 切页

Axure 9.0 使用动态面板实现 Tab 切页

一、页面元件准备拖拽动态面板到画布,命名为tab_panel,设置足够宽高用来承载各个 Tab 内容。双击动态面板,新建多个状态,分别命名,例如tab1首页、tab2列表、tab3设置,每个状态内放入对应页面的内容。3. 在页…

2026/9/24 16:51:01 阅读更多 →

最新新闻

Linux与Windows系统运维:参数查询与配置命令对照实战

Linux与Windows系统运维:参数查询与配置命令对照实战

很多时候,我们干的活儿并不是什么高深莫测的架构设计,反而是那些每天都在重复的“查一下参数、改一个配置”。尤其是当你的手头同时管着 Windows 服务器和 Linux 服务器时,这种“精神分裂”的感觉会特别明显:明明在 Windows 上用图…

2026/9/24 18:28:13 阅读更多 →
RabbitMQ安装详解:Windows与Docker高频坑与权限排查

RabbitMQ安装详解:Windows与Docker高频坑与权限排查

先聊点实际的。你点进这篇文章,多半是因为项目里突然要用消息队列,或者面试题刷到“RabbitMQ和Kafka怎么选”,又或者已经在Windows上装了RabbitMQ,结果服务死活起不来,管理界面也打不开。不管你是哪种情况,…

2026/9/24 18:28:13 阅读更多 →
Linux与Windows参数查询与配置:双系统实战速查手册

Linux与Windows参数查询与配置:双系统实战速查手册

1. 项目背景:为什么我要维护一份“Linux与Windows参数查询与配置”手册自从开始同时接触Linux服务器和Windows桌面环境,我就一直被同一个问题反复折磨:某个参数上次明明调通了,下次换台机器又得从头翻文档。更让人崩溃的是&#x…

2026/9/24 18:28:13 阅读更多 →
Flutter状态边界:UI树才是决定setState刷新范围的关键

Flutter状态边界:UI树才是决定setState刷新范围的关键

有人问我一个很经典的问题:setState明明调了,数据也变了,界面就是不动,到底哪里出了问题?我听完他的代码描述,第一反应不是去看状态管理库配没配好,而是反问他一句:你这段状态&#…

2026/9/24 18:28:13 阅读更多 →
基于OpenCV模板匹配的车牌识别毕业设计实战指南

基于OpenCV模板匹配的车牌识别毕业设计实战指南

简介:这是一套基于OpenCV模板匹配的车牌识别毕业设计源码,使用Python 3.8与OpenCV 4.2开发,并配有简单的GUI界面。项目面向计算机相关专业的学生或课程设计用户,主要解决从车辆图像中定位车牌、校正倾斜、判别牌照颜色、分割字符并…

2026/9/24 18:28:13 阅读更多 →
【Coze】【视频】治愈系老爷爷工作流

【Coze】【视频】治愈系老爷爷工作流

今天给大家演示一个 老爷爷语录视频自动生成工作流。该工作流通过大语言模型和图像生成模型的协作,自动完成从文本语录生成、格式化处理、配图生成,再到视频合成和音频配乐的完整流程。结合效果展示,用户只需提供简单的输入,就能得到带有温馨画面和背景音乐的成品视频,大幅…

2026/9/24 18:27:12 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →