# 码头路径调度与路径规划
**Repository Path**: jajimeidou/wharf_dispatching_path_planning
## Basic Information
- **Project Name**: 码头路径调度与路径规划
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 8
- **Forks**: 4
- **Created**: 2020-07-18
- **Last Updated**: 2024-04-25
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 外四码头调度服务
本项目为外四码头改造提供以下服务
+ 各类车辆的调度
+ 车辆运行路径的规划
+ 码头内交通的控制
同时配备了控制界面
+ 将本服务的各项输出进行可视化呈现
+ 对本服务的运行状况进行监控
+ 允许操作员手动控制执行相关功能,人为介入服务运行
此文档包含以下部分
+ [系统边界](#系统边界)
+ [系统架构](#系统架构)
+ [下载安装](#下载安装)
+ [前端](#前端)
+ [后端](#后端)
+ [开发运行](#开发运行)
+ [接口及数据格式](#接口及数据格式)
## 系统边界
本系统实际运行环境中依赖于码头内部的上位机,本系统的输入输出均是与上位机交互。以下是本系统的运行环境(图中绿色部分即为本系统)
> 注:开发过程中并未直接接入实际码头的系统,所以该项目代码中包含了一个虚拟上位机,详见[后台说明文档](./backend/readme.md)
## 系统架构
本系统内部采用传统的客户端/服务端架构,相关代码和说明文档分别在:客户端([前端](./application))、服务端([后台](./backend))
## 下载安装
项目源码直接在页本面右上方点击克隆/下载按钮下载压缩包至本地,解压即可。
在运行之前需要安装相关的依赖
### 前端
开发之前需要配置好 node 环境,安装 npm 工具
若使用 vscode 打开本项目,在终端进入开发目录
```shell
> cd .\application\wharf_map\
```
安装项目依赖
```shell
> npm install
```
安装完毕后发现当前目录下多出一个 `node_modules\` 目录,里面就是安装好的依赖
### 后端
开发之前配置好 python3 运行环境(建议使用 python 3.8),
进入开发目录 `backend`
```shell
> cd .\backend\
```
执行以下指令安装所需的包
```shell
> pip install -r requirements.txt
```
## 开发运行
技术栈说明
+ 前端:js, html, css
+ [Vue](https://github.com/vuejs/vue)
+ [tweenjs](https://github.com/tweenjs/tween.js/)
+ websocket
+ 后端:python3
+ [asyncio](https://docs.python.org/zh-cn/3/library/asyncio.html) 异步编程
+ [aiohttp](https://docs.aiohttp.org/en/stable/) web 后台基础
开发手册:
+ 前端:[开发运行指南](./application/readme.md)
+ 后端:[开发运行指南](./backend/readme.md#运行)
## 接口及数据格式
本系统的输入数据均来自码头的上位机,下面对所需数据进行详细说明,接口列表如下:
+ [车辆实时状况](#车辆实时状况)
+ [当前任务列表](#当前任务列表)
+ [事件](#事件)
### 车辆实时状况
对于码头场地内运行的所有集卡,本系统需要知道它们的实时信息,用于调度和交通控制。
车辆信息的数据格式如下
```json
{
"time": " 当前时间",
"vehicles": [
{
"id": " 集卡的编号(独一无二)",
"auto": " 是否为无人车",
"task_id": " 当前车辆正在执行的任务编号,没有的话就 null",
"status": " 车辆的状态",
"coordinate": {
"x": " 在场地内的横坐标",
"y": " 在场地内的纵坐标"
},
"position": " 所属的位置点(地图打点的序号)",
"capacity": " 车辆的容量(能装的集装箱数量)",
"energy": "[1, 100] 剩余能量百分比(能量包括油量或电量)",
"velocity": " 车速",
"acceleration":" 当前的加速度",
"direction": {
"x": " cosθ(θ为方向角)",
"y": " sinθ(θ为方向角)"
},
"path": "[] 当前在走的路径的点集(地图打点的序号集合),没有就是空数组"
},
...
]
}
```
|参数名|类型|说明|
|-----|----|:---|
|time|字符串| 当前时间点 |
|vehicles|数组| 车辆信息的数组 |
车辆信息内部参数说明如下
| 参数名 | 类型 | 说明 |
| ------------ | ----------- | ------------------------------------------------------------ |
| id | 字符串 | 集卡的编号(独一无二) |
| auto | 布尔 | True:是无人车;False:有司机驾驶 |
| task_id | 字符串/null | 被分配的任务编号,没有任务就为空 |
| status | 枚举 | 车辆当前的状态,包含:Free可分配任务,Moving正在驾驶,Busy正在充电/加油 |
| coordinate.x | 整型 | 车辆此时在场地内的横坐标 |
| coordinate.y | 整型 | 车辆此时在场地内的纵坐标 |
| position | 整型 | 车辆此时所在的位置属于地图上事先打好的第几号点 |
| capacity | 整型 | 车辆能装载的集装箱数量 |
| energy | 整型 | 车辆剩余的能量占总能量的百分比(20代表20%),最小 1,最大 100 |
| velocity | 浮点数 | 车当前的速度,单位:米/秒 |
| acceleration | 浮点数 | 车辆当前的加速度,加速为正数,减速为负数 |
| direction.x | 浮点数 | cosθ(θ为方向角) |
| direction.y | 浮点数 | sinθ(θ为方向角) |
| path | 数组 | 车辆当前正在行驶的路径,以点的数组表示,点是地图上打好的点(的序号) |
### 当前任务列表
对于码头当前排上的任务,调度系统需要知道它们的内容,以便为他们分配最合适的车辆。
任务列表信息数据格式如下
```json
{
"time": " 当前时间",
"tasks": [
{
"id": " 任务的编号(独一无二)",
"shipment": " 任务类型,是装船还是卸船",
"time": " 此任务中要求车辆到达目的地的时间",
"direction": " 船只靠岸时船头方向",
"yard_id": " 堆场编号",
"yard_pos": " 堆场所在的位置点序号",
"crane_id": " 桥吊编号",
"crane_pos": " 桥吊所在的位置点序号",
"lock_id": " 需要经过的锁钮机编号",
"lock_pos": " 需要经过的锁钮机所在的位置点序号",
"containers": " 要运输的集装箱数量",
},
...
]
}
```
| 参数名 | 类型 | 说明 |
| ------ | ------ | -------------- |
| time | 字符串 | 当前时间点 |
| tasks | 数组 | 任务信息的数组 |
任务信息的内部结构说明如下:
| 参数名 | 类型 | 说明 |
| ---------- | ------ | ------------------------------------------ |
| id | 字符串 | 任务的编号(与任务本身一一对应,独一无二) |
| shipment | 布尔 | True:装船任务;False:卸船任务 |
| time | 字符串 | 此任务中要求车辆到达目的地的时间 |
| direction | 整型 | 船只靠岸时船头方向,0:向西,1:向东 |
| yard_id | 字符串 | 要去往的堆场编号 |
| yard_pos | 整型 | 该堆场在地图上的几号点位 |
| crane_id | 字符串 | 要去往的桥吊编号 |
| crane_pos | 整型 | 该桥吊在地图上的几号点位 |
| lock_id | 字符串 | 该任务要求车辆经过的锁钮机编号 |
| lock_pos | 整型 | 该锁钮机在地图上的几号点位 |
| containers | 整型 | 该任务要运输的集装箱数量 |
### 事件
用于触发单车调度,这个码头场地中的事件包括:车辆到达任务终点后发出的信号,车辆的能源不足发出的信号,司机午休时间去食堂通过终端发送一个信号,等等诸如此类的事件均通过上位机发送给调度系统。
发送的具体数据格式如下
```json
{
"time": " 当前时间",
"signal": " 事件的类型名",
"id": " 发生该事件的车辆编号",
"position": " 事件发生的地点,即此时车辆在地图上的点位"
}
```
参数说明如下:
| 参数名 | 类型 | 说明 |
| -------- | ------ | -------------------------------------------------- |
| time | 字符串 | 当前时间点 |
| signal | 字符串 | 事件的类型名,有充电,加油,任务完成,食堂用餐 |
| id | 字符串 | 发生该事件的车辆编号 |
| position | 整型 | 事件发生的地点,即此时车辆在地图上的点位 |