
简介本资源是面向AGV调度与仓储自动化从业者的openTCS 5.9中文版官方用户手册适合刚接触开源运输控制系统RCS的工程师、集成商以及需要搭建车辆调度平台的开发者阅读可解决英文文档理解成本高、工厂模型与运输订单概念不清等入门难题。压缩包内为1个PDF文件大小约13.31MB按章节组织涵盖软件目的、系统要求与Apache 2.0许可说明系统组件与结构点、路径、位置、车辆、块、图层等工厂模型要素以及运输订单、订单序列、外设作业等工厂运行要素并延伸至系统操作、操作指南与常见问题解决方案配有截图辅助理解。目前已有598人学习。读者可据此掌握控制台、运输任务管理器与车辆控制器的协作方式理解工厂模型建模与订单流转逻辑快速完成环境准备、模型编辑与故障排查为后续定制系统逻辑与对接实际AGV打下基础。1. 先弄明白一件事openTCS 到底是个什么东西第一次听到 openTCS 这个名字很多人会猜成某家快递公司的内部系统。其实它是一套开源的车辆调度软件全称 Open Transportation Control System干的事说白了就是给工厂里的自动导航小车AGV和移动机器人当交通指挥中心哪台车去哪个货架、走哪条路、在路口谁先过、没订单时停哪儿充电全由它统一安排业内也常把这类系统直接叫 AGV 调度系统或者 RCS 系统。它最值钱的一点是不挑车——只要你的车能通信不同品牌、不同导航方式的车可以接进同一个系统里一起调度。这份 openTCS 5.9 中文版用户手册就是把上面这些事从零讲一遍的操作说明书原本是英文的现在有中文可读对零基础的人来说省下了一大截啃词典的时间。2. 为什么值得学从一台车跑起来到十台车不打架2.1 一台车靠脚本十台车就得靠规则单台 AGV 的控制其实很朴素给一个目标点它自己按预设的导航方式走过去中途没有谁跟它抢路。很多人第一次接触调度系统会觉得多余觉得「我写个循环不停发目标点不就行了」。问题出在车变成三台、五台、二十台之后路网是共享的路口、窄道、装卸货位这些资源一次只能被一台车占用谁先走谁后等排不好就是互相卡死业内叫死锁。这类问题靠业务代码里堆 if-else 补不回来因为它本质上是资源分配加路径搜索的问题需要专门的算法去解而这些算法正是 openTCS 内核里已经写好、可以直接用的部分。内核把这件事拆成了三个策略模块这是新手第一道必须分清的门槛。调度程序dispatcher负责决定哪张订单交给哪台车路由器router负责给车算出一条成本最低的路线调度scheduler负责交通管制也就是给车分配路段资源、避免相撞。这三个词翻成中文都带「调度」两个字看着糊分工其实很清楚派活、算路、让路。除此之外还有第四个模块外设作业调度程序管的是门、升降机、充电桩这类不是车但也要排队的设备。明白了这四件事你再看手册目录就不会发懵第四章讲的是这四个模块的默认实现怎么跑第五章讲的是这些实现各自有哪些参数可以拧。新手最容易犯的错是一上来就翻第五章把配置项当菜单看结果改了一堆不知道改的是什么。真正的顺序是先看懂这四个角色在干什么再去动它们的旋钮这样每改一个参数你都知道自己在影响派活、算路还是让路。2.2 它是个框架不是开箱即用的成品这一点手册里写得很直白但很多人会跳过openTCS 本身不是一套装好就能控制车的完整软件。它提供的是车辆路由、订单分派、车队交通管理这些基础数据结构和算法实现而它对接的车各家的通信协议都不一样所以中间必须有一个翻译层。openTCS 里管这个翻译层叫车辆驱动也叫通信适配器作用跟操作系统里的设备驱动很像内核只说标准语你的车只懂方言驱动负责来回翻译。换个说法你可能更好接受openTCS 是主体软件车辆驱动是插上去的插件。这个定位决定了你的学习投入——如果只是想把流程跑起来、验证一下自己的方案用自带的虚拟车辆就够了一行驱动代码都不用写如果你要接真车那写驱动这一步绕不开但那是入门之后的事不是第一天的事。先跑通再接入这个顺序反了会很痛苦。所以对新手的建议非常明确第一个目标不是「让真车动起来」而是「用虚拟车辆让一张订单从头到尾跑完」。虚拟车辆可以理解成一台假车它会老老实实响应内核的指令、上报位置、跑完路线唯一不同是它不存在于物理世界。整个过程里所有该走的环节一个不少你能把系统摸熟还不用担心撞坏东西。这个路径在手册的高级使用示例里也有对应的说明配置虚拟车辆的特征属于入门就能碰的部分。2.3 中文手册帮你省掉的三件事第一件是术语。openTCS 的模型里有三个词特别容易混点、位置、位置类型。英文原文里这些词长得像、用法又交叉硬啃原文的人经常读了三章还在猜哪个是坐标、哪个是站点。中文版把这些译名固定下来你按一个口径读到底后面看配置文件、看日志就不会再打结。术语统一看着是小事实际是零基础的人能不能坚持读下去的分水岭。第二件是流程顺序。第三章把系统操作分成两段先构建工厂模型再运作工厂。这个顺序不是随便排的它对应的是「先画地图再放车上路」的现实逻辑。跳过建模直接启动你会发现操作台里空空如也什么也点不了。中文版把这两段的边界写清楚了你照着走至少不会在第一步就卡住。第三件是配置项索引。第五章把所有配置项按应用分了类内核的、内核控制中心的、模型编辑器的、操作台的每一类下面再按功能细分。出问题的时候你能顺着目录定位到该看哪一节而不是在几百行配置里瞎翻。这个价值在你第一次遇到「改了没生效」的时候体会最深。2.4 动手前的三样准备第一样是 Java 运行环境。手册要求的是 13 版本而且明确提醒安装目录下的 bin 子目录要加进环境变量 PATH否则自带的启动脚本找不到 Java。还有一句提醒很关键——某些 JRE 与它依赖的界面库不兼容建议用主流的开源 OpenJDK 发行版。这条不看后面大概率会撞上一个莫名其妙的界面报错。第二样是网络。openTCS 是客户端-服务器结构内核是服务器模型编辑器、操作台、内核控制中心都是客户端它们之间靠网络通信。全部跑在同一台机器上也行本机回环地址就够。但如果你打算把内核和客户端分到两台机器上得先把防火墙和地址配通这个在手册的高级示例里有专门一节。第三样是一台车或者干脆用虚拟车辆。零基础的人不要一上来就接真车先把虚拟车辆跑顺。另外准备一点点命令行操作能力就够了不需要提前学 Java——除非你后面要写车辆驱动那属于第二阶段的事。3. 先把地图看懂工厂模型里的七个要素怎么认3.1 点、路径、位置一张路网的三个零件openTCS 里所有跟场地有关的东西都装在一个叫工厂模型的容器里它相当于一张给系统看的地图。这张地图的最小零件是点。点是行驶路线上的一个逻辑节点运行的时候车辆就是被命令从一个点移动到另一个点。点有三种类型区别全在「车到了这儿能干什么」停靠位置是默认类型车可以在这儿短暂停一下办点事到了要上报报告位置只上报不许停、不许停靠所以一条全由报告位置拼起来的路是没法算出路线来的因为车在哪儿都停不下来停车位置则是车不接单时长期待着的地方。第二个零件是路径。路径连接两个点是有方向的属性包括长度、最大行进速度、最大倒车速度、锁定标志以及一串外设操作。长度和速度这两个值要不要紧取决于路由器的配置——路由器可以拿它们算成本也可以完全不看。锁定标志一设路由器算路时就会绕开这条路径这在施工、封道、单向管制的时候很好用。第三个零件是位置。这个词最容易误会它不是「坐标位置」而是「车能在这儿干特殊活的地方」装货、卸货、充电。位置必须链接到至少一个点否则车辆根本到不了等于白建。用一个类比串起来点是地铁站路径是站与站之间的轨道位置是站里的便利店和充电桩——车能停靠在站里但只有挂了便利店的那些站才能办事。3.2 位置类型、车辆、块、图层把规则挂上去位置类型是给位置做分类用的抽象概念。它只干两件事定义这一类位置允许车辆做哪些操作以及允许挂在这类位置上的外设设备做哪些操作。听起来抽象好处很实在——十个充电位如果规则一样你只要建一个「充电位」类型然后让十个位置都引用它以后规则变了改一处就全变。新手常见的做法是一个位置配一套规则改起来想哭。车辆这个要素映射的是实物车属性里有四个电量阈值临界、良好、完全充电、充分充电。临界值决定什么时候必须去充电良好值决定什么时候不用充另外两个决定充到什么时候可以停。还有最大行驶速度和最大倒车速度路由器可能拿它们算成本。最需要注意的是集成级别它有三个档忽略、关注、尊重。忽略的车完全不显示也不可用关注的车会显示位置但不分配资源只有在尊重状态下这台车才会真正参与调度。块是用来限制车辆活动范围的区域概念可以把某片路网划出来单独管冲突区、单车道、装卸区都适合用块圈一下。图层和图层组则是纯显示层面的东西只影响你在模型编辑器和操作台里怎么看待这张图不影响任何运行逻辑。这一点务必记牢后面避坑章节还会提到。3.3 布局坐标和模型坐标为什么要有两套每个点身上其实挂着两套坐标。布局坐标只负责画图好看模型编辑器、操作台里那个图形界面用的就是它模型坐标才是真正可能被车辆驱动拿去用、或者发给车辆的数据比如车需要一个目的地的精确坐标来导航。这两套坐标彼此不挂钩可以完全不一样。为什么要这么设计因为现实里有些路特别长画图的时候你希望把那段压缩一下好把注意力放在密集的区域但车拿到的坐标必须是真的。所以你在图上拖动一个点改的只是布局坐标模型坐标纹丝不动。要同步有两个办法全局的话用菜单里的「将模型值复制到布局」或者「将布局值复制到模型」只想改一个要素就右键它在右键菜单里选同样的两项。这里有个新手百分之百会踩的坑搭完模型直接启动车跑到一个完全莫名其妙的位置上。原因就是模型坐标全是零、或者还是旧值而布局坐标看着漂亮得很。记住一句话图上对不代表数据对两套坐标是两份东西。3.4 手把手在模型编辑器里画出第一条能跑通的路下面这十步是从零搭一个最小可用模型的过程照着做一遍你对前面那些概念的理解会立刻落地。启动模型编辑器新建一个工厂模型。先放三个点排成一条直线然后用路径把它们两两连起来注意方向是从起点指向终点。把起点和终点这两个点的类型设成停靠位置中间那个保持默认也行但别设成报告位置。新建一个位置把它链接到终点那个点上。新建一个位置类型勾上允许的车辆操作再把刚才那个位置设成这个类型。添加一台车辆把四个电量阈值按你希望的策略填上速度随便填个合理值。用一个图层把点、路径、位置分开放方便以后维护。检查两套坐标如果模型坐标是空的用「将布局值复制到模型」同步一次。保存工厂模型文件会落到数据目录下。打开内核控制中心把这份模型加载进内核。每一步背后都有原因。第二步强调方向是因为路径是有向的只连一个方向的话车去了就回不来。第三步强调别设报告位置是因为整条路上一个可停靠的点都没有时路由器会告诉你这条路没法走。第四步的链接关系决定了位置能不能被访问没链接的位置在运行阶段就是个摆设。第五步用类型而不是逐个配置是给自己留后路。第八步是前面讲的坐标坑的预防针。这套最小模型只能让车从 A 走到 B没有任何业务含义但它把所有必要的要素都串了一遍。等你熟悉了再往里加货位、加充电桩、加冲突区就是在同一个骨架上长肉。4. 让车动起来第一个能跑通的运输订单4.1 四个进程怎么起谁先谁后openTCS 跑起来是四个独立进程各有各的分工。内核是服务器真正干活的都在它里面内核控制中心用来控制和监视内核比如把车辆驱动分配给车辆、看每台车的详细状态模型编辑器负责建工厂模型操作台负责运行期间的可视化和下单。四个进程分开跑是设计上的选择好处是你可以在另一台机器上开操作台也可以只重启某一个而不影响其他。启动顺序有个硬规矩内核必须先起。客户端连不上内核就是一个空壳界面上什么都不会有。日常的启动次序是内核、内核控制中心、模型编辑器、操作台。内核刚起来那几秒端口可能还没准备好别急着连等它把日志打完。下面这几行是准备阶段最该先做的事# 确认命令行能找到 Java并且版本对得上手册要求 13 java -version # 如果提示找不到命令把 JDK 的 bin 目录加进 PATH # 路径换成你自己安装的位置Windows 下在系统属性里配 export JAVA_HOME/opt/jdk-13 export PATH$JAVA_HOME/bin:$PATH # 再确认一次输出里带 13 再往下走 java -versionjava -version会打印三行左右的信息第一行才是版本号别被后面的构建信息带偏。JAVA_HOME本身不是 openTCS 强制要求的它只要求 bin 目录在 PATH 里设这个变量是为了让 PATH 那行写起来短一点、也不容易写错。配完之后一定要新开一个终端窗口再验证很多「配了没用」的情况只是因为旧窗口还带着老的环境变量。这一步过了后面自带的启动脚本才跑得起来。4.2 接上车辆驱动把抽象车接上真车内核里有个驱动框架负责管理通信信道并把具体的车辆驱动和具体的车辆关联起来。所谓「分配驱动」就是告诉内核这台车用这个驱动去说话。这件事在内核控制中心里做模型编辑器里做不了——因为驱动是运行时概念模型是静态数据。用虚拟车辆的话这一步几乎是自动的发行版自带虚拟车辆驱动你在控制中心里把它分配给那台车就行。真车的话你得先有对应的驱动再走同样的分配流程。驱动本身还能通过控制中心向用户提供一些底层功能比如手动给车发一条报文调试的时候特别有用——车不动你可以先手动发一条看它有没有反应这样就把「调度没派活」和「通信断了」两种情况区分开了。一个很实用的事实是一个 openTCS 实例可以同时管理不同类型的车前提是每台车都配了合适的驱动。这也是它号称不挑车的原因。你完全可以在同一个模型里放两台虚拟车加一台真车让它们一起跑验证调度逻辑。4.3 创建第一张运输订单看着它走完模型加载好、驱动分配好、车在操作台里显示为可调度状态之后就可以下单了。流程是在操作台里新建一张运输订单指定起点位置和终点位置提交。接下来会发生一串你看得见的事——调度程序挑一台合适的车路由器算出一条路线调度模块给车分配沿途的资源车开始走位置实时更新到终点后订单完成。第一次跑的时候建议只放一台车、一张订单把注意力放在观察上车是先去了起点还是直接奔终点中途有没有在某个点上停顿订单状态从创建到执行为再到完成中间经过了哪些值这些观察比读十页文档管用。等单车的流程顺了再开第二台车、下两张订单看它们怎么互相让路那时候你才会真正理解「交通管制」这四个字的分量。操作台还提供撤销订单的功能。撤销不是删除它会让正在执行这张订单的车停下来、把已占用的资源释放掉。这个动作在调试时很常用发现派错车了撤销重下比等着它跑完好得多。连续创建多张订单的场景手册里也提到了本质上就是重复下单动作注意别把起点终点填反。4.4 订单序列和外设作业多车协同时的两个概念订单序列是把多张运输订单打包成一个整体。它解决的问题是有些运输任务必须按顺序完成中间不能被别的订单插队否则前一步的货还没卸后一步的车已经来了。用序列包起来系统就知道这几张单是一伙的得连着做。外设作业是另一类东西它不对应「车从 A 到 B」而对应「让某个设备做件事」比如开门、升降机升降。外设作业由外设作业调度程序管用到令牌机制来保证同一时刻只有一个作业占用某个设备。位置可以映射外设设备路径上也可以挂外设操作触发时机有两个值车辆穿过路径之前触发或者穿过之后触发如果再勾上完成要求车就必须在原地等操作做完才能继续走。这两个概念新手第一遍不用深究但要知道它们存在。等你开始做「车到门口门开了车才过」这种场景会回头来找这一节。5. 新手避坑五个让车停在原地不动的常见问题5.1 建模阶段的两个坑现象模型画得挺漂亮一启动车就是不动日志里也没有明显的红色报错。原因整条路网里的点全是报告位置一个可停靠的点都没有路由器算不出一条可行的路径于是干脆不派。解决回到模型编辑器把起点和终点至少设成停靠位置路径中间的过渡点可以保留报告位置但不能整条路一个能停的都没有。这条坑的迷惑性在于它不报错只是安静地不干活。现象图上位置明明对车却跑到了一个完全对不上的地方或者所有车都挤在原点附近。原因布局坐标和模型坐标是两套数据你在图上拖点只改了布局坐标模型坐标还是空的或者旧的。解决用菜单里的「将布局值复制到模型」做一次全局同步或者选中单个要素右键同步。养成习惯每次大改完模型都同步一次再保存加载。5.2 启动与运行阶段的三个坑现象双击启动脚本界面一闪就没了或者弹出一个跟界面库相关的报错。原因JRE 版本不对或者用的发行版跟 openTCS 依赖的界面库不兼容手册里专门提醒过这件事。解决换成主流的开源 OpenJDK 13 发行版确认 PATH 指向的是它而不是系统里另一个旧的 Java改完 PATH 一定要新开终端验证。现象模型加载了车也在模型里建好了操作台里就是看不到这台车。原因这台车的集成级别是「忽略」。这个属性只能在操作台里改模型编辑器里改不了所以在模型里怎么找都找不到。解决打开操作台把它的集成级别调到「尊重」它才会参与调度、显示位置。中间那一档「关注」是个过渡态车会显示但不会分到任何资源调试的时候可以用来观察。现象两台车在一条窄道里对着开然后谁也不动了等十分钟还是不动。原因交通管制是按资源占用分配的模型里没把冲突区域隔出来两台车各占一半资源互相等对方释放标准的死锁。解决用块把冲突区圈起来限制同时进入的车辆数或者直接把某条路径的锁定标志打开让路由器绕路。更进一步的做法是在模型阶段就想清楚哪些路段是单车道提前用块规划好别等跑起来再救火。6. 下一步学什么从跑通一次到能改策略的路线图跑到这里你已经能把一张订单从创建看到完成也知道了点、路径、位置、车辆这几样东西各自是什么。接下来最忌讳的是漫无目的地翻手册正确的做法是按「能不能解释现象」来推进而不是按页码推进。第一站是默认策略那一章。四个模块的默认实现都在那儿默认调度程序怎么选停车位置、停车位置有优先级、充电位置怎么选默认路由器用什么成本函数、路由组是什么资源怎么分配怎么释放、调度的公平性怎么算外设作业调度程序怎么预留令牌。这一章的价值不在于背下来而在于你看到一台车被派了一张「看起来不太合理」的单时能说出它为什么被这么派。能解释才算真懂。第二站是配置那一章。内核、订单池、调度、路由、外设作业调度、两个 Web API、RMI 接口、SSL、虚拟车辆、虚拟外设加上控制中心、模型编辑器、操作台各自的配置全都按应用分好了类。看的时候带一个具体问题去查比如「我想让车没单的时候自动回停车位置充电」然后顺着找到对应的项。第三站才开始碰代码。要接真车就写车辆驱动这时候该看的是开发者指南和接口文档不是这本用户手册。要让上层系统下单就去用 Web API 或者远程调用接口手册里对这两条通道有说明。阶段重点看手册哪一块判断自己过关的标准跑通全流程系统操作能用虚拟车辆把一张订单从创建跑到完成看懂调度结果默认策略能解释某台车为什么被派了这张单、为什么走这条路改得动配置配置 openTCS改完知道要重启哪个进程、去哪儿确认生效接得上真车开发者指南与接口文档自己的车能上报位置、能收到移动指令连得上上层Web API 与远程调用部分外部系统能下单、能查订单状态最后说一个我自己的教训。刚开始那阵子我改完模型直接启动车不动就从头翻手册一翻两小时最后发现只是某个点被设成了报告位置。从那以后我每次改完模型都强制走一遍固定的检查动作先看起点终点是不是可停靠类型再同步两套坐标再确认车辆集成级别是尊重最后才启动。这几步加起来不到一分钟省下的时间按小时算。希望帮到你。本文还有配套的精品资源点击获取