1、OpenTCS 项目简介
OpenTCS是一款著名的开源AGV控制软件,具有运输订单管理、运输车辆分配、路由分配和交通管制等完整的调度功能,功能强大,也可用于其他移动设备控制,如机器人、无人机等。
2、OpenTCS 项目源码
2.1 项目官网地址为:
openTCS - The open transportation control system
2.2 项目Github官方仓库地址为:
GitHub - openTCS/opentcs: The open Transportation Control System (by Fraunhofer IML)
2.3 源码获取方式
可以在官网主页下载release压缩包,也可以到github上下载最新版;
3、下载安装jdk
jdk版本说明,务必使用jdk13,如 jdk-13.0.2_windows-x64_bin.exe,非常重要!
安装完毕,记住配置系统环境变量,将jdk的bin文件夹路径添加到path中。不会的网上搜索相关教程。
4、IDE的选择与安装
笔者尝试过IntelliJ IDEA 2021.2与NetBeans-12.0,对比如下:
IntelliJ IDEA:闭源、收费、破解麻烦、部分参数设置不方便、不支持OpenTCS项目中的GUI开发;但是也能用;
NetBeans:开源、免费、无需破解、无需注册,项目所有相关插件自动提示下载,按本教程操作无需任何参数配置即可使用,支持GUI开发,OpenTCS官方推荐。
因此,这里仅介绍NetBeans开发环境配置。
(1)安装netbeans,Apache-NetBeans-12.0-bin-windows-x64.exe
下载地址:Apache Downloads
(2)使用netbeans打开OpenTCS项目,点击菜单File——Open Project,弹出对话框,选择本地文件OpenTCS项目源码根目录,此时netbeans会检测项目所需插件,弹出下载和安装插件的对话框,根据提示安装和升级所有插件。
项目打开后如图所示:
5 编译运行
打开项目后,需要对项目进行编译,可以对子项目单选或多选右键菜单选择build,也可以在运行gradle命令进行编译,如下图所示:
openTCS项目本身使用Gradle作为构建管理工具。 要从源代码构建openTCS,只需从源代码发行版的主目录运行gradlew build。 有关如何使用Gradle的详细信息,请参阅其文档。
在根项目中可以运行的主要Gradle任务有:
- build: 编译所有子项目的源代码。
- release: 在build/中构建并将所有系统组件打包到一个发行版中。
- clean: 清理其他任务产生的所有东西。
可以在IDE中选择子项目点击菜单运行,也可以执行release后生成的发行版。无论按那种方式运行都要启动以下组件:
- build\install\openTCS\openTCS-Kernel\startKernel.bat 启动项目内核程序,启动后以服务形式运行,不能关闭;
- build\install\openTCS\openTCS-KernelControlCenter\startKernelControlCenter.bat 启动项目内核控制中心,用于查看内核状态和管理车辆状态;
- build\install\openTCS\openTCS-ModelEditor\startModelEditor.bat 启动地图模型编辑器
- install\openTCS\openTCS-OperationsDesk\startOperationsDesk.bat 启动操作桌面,为AGV调度系统最核心的应用界面。
6 相关代码说明
(1)LoopbackCommunicationAdapter.java 系统内置虚拟小车驱动
/**
* Copyright (c) The openTCS Authors.
*
* This program is free software and subject to the MIT license. (For details,
* see the licensing information (LICENSE.txt) you should have received with
* this copy of the software.)
*/
package org.opentcs.virtualvehicle;
import com.google.inject.assistedinject.Assisted;
import java.beans.PropertyChangeEvent;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
import static java.util.Objects.requireNonNull;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import ja