# new-safe-robot
**Repository Path**: belingbeling/new-safe-robot
## Basic Information
- **Project Name**: new-safe-robot
- **Description**: 合肥工业大学应急操作机器人项目
- **Primary Language**: C++
- **License**: AGPL-3.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 8
- **Forks**: 2
- **Created**: 2022-08-23
- **Last Updated**: 2025-10-11
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
#
安全机器人操作平台 V0.3
# 一. 程序界面
## 1.1 界面组成
本程序界面主要由界面顶部的`变电所选择区`、界面左侧的`页面选择区`、界面下方的`状态监测区`,和界面中央的`显示和操作区`组成。

各组成部分的功能如下:
### 1. 变电所选择区
变电所选择区主要用于选择当前软件操作与监控的变电所、当前变电所的电气柜和在主界面显示的有关当前变电所的内容。、

**变电所:**
用于选择软件操作与监控的电气柜:

点击该控件,会弹出当前可选的变电所名称:

选择变电所后,将从数据库加载与该变电所有关的所有电气柜和线路图内容。
**电气柜:**
用于选择当前变电所的电气柜名称:

点击该控件,会弹出当前变电所可选的电气柜名称:

选择电气柜后,将从数据库加载所属该电气柜的所有设备信息。
**显示内容:**
用于选择当前变电所的线路图和视频和界面。

点击该控件,会弹出当前变电所可选的线路图和视频画面:

点击该控件后,通知主界面将显示内容改为该控件的当前所指内容。
### 2. 页面选择区
功能切换栏属于自定义组件,其中包含4个部分,分别为`主页`、`操作`、`数据`、`设置`。点击控件会跳转到对应的主界面、操作页面、数据界面和设置界面。

其中,主页对应主界面,主要用于显示当前变电所和线路图和视频画面;操作对应操作页面,主要用于对当前变电所的电气柜设备进行操作;数据对应数据页面,主要用于显示当前变电所的数据信息;设置对应设置界面,用于对当前变电所的配置信息进行更改。
### 3. 显示和操作区
显示和操作区域位于本界面中心,与**页面切换区**进行了绑定,当用户在**功能切换栏**进行了点击操作后,显示和操作区域会显示对应的界面。
其中,可显示的页面包括**主界面**、**电气柜操作界面**、**数据显示界面**、**设置界面**。
## 1.2 主界面
### 1. 概述

主界面用于显示或操作当前变电所的**线路图界面**和**视频监控界面**,其内容由变电所选择区的显示内容决定。
### 2. 线路图界面
线路图界面由手绘线路图组成,线路图中分为不可交互区和可交互区(绿色的线不可交互)。
线路图界面可以对其中红色区域进行鼠标的左键点击交互。当用户使用鼠标左键点击红色区域后,红色区域变为绿色区域,并弹出**操作提示**,用户可以根据弹出的操作提示对该区域进行**状态改变**等操作,并且该区域的颜色会在**绿色**和**红色**之间进行转换。
### 3. 视频监视界面
用户对操作机器人上所连接相机的图像实时显示,并将采集到的图像通过UDPSocket发送给主机。
视频图像通常为RealSense iD415所拍摄,分辨率可调,最大支持1280*720像素,最高帧率60FPS。
## 1.3 电气柜操作界面
### 1. 概述
电气柜操作界面如下:

该界面为组态类型, 可以通过右上角的**新建电气柜**和**编辑电气柜**按钮对操作界面中的内容进行编辑,可以对设备控件进行位置和数据的修改。
使用鼠标对界面中设备进行点击会触发**设备动作**以弹出设备交互界面,以鼠标点击*旋钮22*设备为例,会弹出以下界面:

该界面由程序自动生成,可交互控件为**Operator**中的按钮和最下方的**Cancle,Ok**按钮。
其中,**Operator**中的按钮表示当前设备可操纵的值,例如当前设备旋钮22为三档自锁旋钮,其旋柄拥有左、中、右三个状态的值,则**Operator**中的按钮分别对应这三个状态。用户点击**Operato**中的按钮后会触发消息传输机制,通过通信协议和定义好的设备动作流程控制机器人和机械臂的工作。
* 在空白处按住鼠标右键可以对整个设备界面进行拖动
### 2. 新建电气柜
点击**新建电气柜**按钮后出现该界面,用于新建一个电气柜及其上面的设备数据, 该界面如下:

在弹出的界面中会出现默认的电气柜设备图, 具体为包含一个**标定板设备**.
此时可以通过右上角的**新建设备**按钮添加设备, 具体界面如下:


在**新建设备**时可以修改该设备的信息, 包括**设备类型**、**设备细分**、**相对于标定点偏移**、**设备坐标**等信息。具体有关设备信息定义见数据库章节。
修改**设备种类**和**设备细分**后, 将该设备选择为如下所示的设备:

点击确认后, 界面会在屏幕中添加**新建的设备**, 并且在新建后通过点击该设备可以在**选中设备**中进行显示, 并将操作信息表示在**操作记录**中, 具体界面变为如下:

在选中设备后, 点击**选中设备**中的**编辑设备按钮**可以对选中的设备信息进行编辑, 编辑设备界面与新建界面类似, 具体如下:

此时可以对该设备信息进行编辑, 并在点击确定后更新该设备信息.
在所有操作完成后可以通过点击界面右上角的**保存电气柜**按钮对该界面中的所有设备信息进行保存. 点击**保存电气柜**按钮后会出现保存弹窗提示, **确认**按钮会保存所有设备信息到数据库, **取消**按钮会取消此次保存并返回到新建界面. 保存弹窗如下:

* 在空白处按住鼠标右键可以对整个设备界面进行拖动
### 3. 编辑电气柜
在操作主界面中可以通过点击右上角的**编辑电气柜**按钮对当前页面中的所有设备进行编辑, 点击**编辑电气柜**按钮后弹出的界面如下:

该界面布局与**新建电气柜**界面布局类似, 不再介绍.
## 1.4 数据显示界面
### 1. 概述
用于对数据库中的温度和局放数据进行显示,并根据日期进行图像显示。
左侧为温度、局放功能选择栏,上方为数据表示显示界面,下方为数据图显示界面

### 2. 数据表格显示界面
对**当前电气柜**的**节点**数据选择并显示。
1. 显示节点筛选器
对当前电气柜中的**节点**数据在图表上显示。
使用如下表格对温度/局放数据进行展示。
| 柜名 | 节点 | 时间 | 数据 | 状态 |
| -------- | ------ | ------------------- | -------- | -------- |
| 具体柜名 | 节点名 | yyyy-MM-dd hh-mm-ss | 具体数据 | 温度状态 |
1. 柜名:由**菜单栏**中的**电气柜**中进行选择
2. 节点:该电气柜中温度采集节点的名称
3. 时间:数据采集时间,格式为yyyy-MM-dd hh-mm-ss,CTS
4. 数据:具体数据,double格式,精确到小数点后2位
5. 状态:该数据是否超过警戒值、警告值;若低于警戒值则为绿色,高于警戒值但低于警告值为黄色,高于警告值为红色。
数据不可修改。
### 3. 数据折线图显示界面
对**当前电气柜**的**全部节点**数据进行折线图显示。
并具有对数据的时间筛选和Y轴筛选功能。
1. 时间筛选器
1. 用于选择数据显示的开始和结束时间。
2. 当start时间小于等于end时,将end时间调整为start+1个月。
2. Y轴筛选器
1. 用于选择折线图Y轴数据显示的范围。
2. 当start数据小于end时,将end时间调整为end+20。
当修改了时间筛选器或Y轴筛选器后,数据折线图会进行刷新。
## 1.5 设置界面
### 1. 概述
设置界面中可以对**远程管理机**、**现场管理机**、**相机**、**Jaka**、**Standard**、**数据采集**等功能进行参数设置。

# 二. 数据库
## 1. 表及字段意义
在软件外部,使用SQLite实现创建、删除、修改和查询数据库的功能。
在本软件中,使用Qt中的QDataBase及其子类实现创建、删除、修改和查询数据库的功能。
数据库名为**data.db**,分为:
1. idMap表:存放电气柜id和电气柜现实名称信息。具有字段:
1. id:存放电气柜编号,依据[电气柜id命名标准](#电气柜id命名标准)进行创建;
2. title:存放电气柜实际名称,依据[电气柜title命名标准](#电气柜title命名标准)进行创建;
| id | title |
| ---------- | -------------- |
| 电气柜编号 | 电气柜实际名称 |
2. nodeMap表:存放数据采集节点node和节点名称信息。具有字段:
1. node:存放数据采集节点编号;
2. nodeName:存放节点实际名称;
| node | nodeName |
| ---------------- | ------------ |
| 数据采集节点编号 | 节点实际名称 |
3. deviceType表:存放电气柜上的各设备类型。具有字段:
1. superclass:设备种类,根据[电气柜设备种类命名标准](#电气柜设备种类命名标准)进行创建;
2. subclass:设备子类型,根据[电气柜设备子类型命名标准](#电气柜设备子类型命名标准)进行创建;
3. name:设备实际名称,根据[电气柜设备名称命名标准](#电气柜设备名称命名标准)进行创建;
| superclass | subclass | name |
| ---------- | ---------- | ------------ |
| 设备种类 | 设备子类型 | 设备实际名称 |
4. allDevice:存放所有电气柜中的所有设备数据。具有字段:
1. id:存放电气柜编号,依据[电气柜id命名标准](#电气柜id命名标准)进行创建;
2. index:该电气柜中某设备编号;
3. superclass:设备种类,根据[电气柜设备种类命名标准](#电气柜设备种类命名标准)进行创建;
4. subclass:设备子类型,根据[电气柜设备子类型命名标准](#电气柜设备子类型命名标准)进行创建;
5. name:该设备实际名称;
6. color:该设备颜色;
7. value:该设备的当前值,依据[电气柜设备值命名标准](#电气柜设备值命名标准)进行创建;
8. relativeX:该设备实际中相对于标定点的X位置信息;
9. relativeY:该设备实际中相对于标定点的Y位置信息;
10. relativeZ:该设备实际中相对于标定点的Z位置信息;
11. roiX:实际检测中对该设备的ROI区域截图X位置信息;
12. roiY:实际检测中对该设备的ROI区域截图Y位置信息;
13. roiWidth:实际检测中对该设备的ROI区域截图的Width;
14. roiHeight:实际检测中对该设备的ROI区域截图的Height;
15. amendX:实际操作中对该设备的操作修正值X;
16. amendY:实际操作中对该设备的操作修正值Y;
17. amendZ:实际操作中对该设备的操作修正值Z;
18. screenX:在屏幕中创建该设备的像素X坐标;
19. screenY:在屏幕中创建该设备的像素Y坐标;
20. screenZ:在屏幕中创建该设备的像素Z级别;
5. allCabinet表:存放各电气柜数据信息,具有字段:
1. id:存放电气柜编号,依据[电气柜id命名标准](#电气柜id命名标准)进行创建;
2. title:存放电气柜实际名称,依据[电气柜title命名标准](#电气柜title命名标准)进行创建;
3. calibrationZ:电气柜的标定板相对于地面的距离(mm);
4. map:电气柜所属SLAM地图的名称;
5. pose:电气柜在ROS导航系统中所处的位姿,格式为**x空格y空格yaw**;其中,x为x坐标,y为y坐标,yaw为角度值;
6. station:电气柜在ROS导航系统所处站点编号;
6. allPostcode:各变电所编号及其名称数据,具有字段:
1. postcode:变电所编号,依据[变电所编号命名标准](#变电所编号命名标准)进行创建;
2. name:变电所名称,依据变电所真实名称进行创建;
7. allDiagram:各变电所中拥有的线路图名称,具有字段:
1. postcode:变电所编号,依据[变电所编号命名标准](#变电所编号命名标准)进行创建;
2. number:数据库编号,用以唯一区分线路图;
3. name:线路图名称,依据真实名称创建;
8. dataParticalDischarge表:存放局放数据信息。具有字段:
1. id:存放电气柜信息信息,依据[电气柜id命名标准](#电气柜id命名标准)进行创建;
2. title:存放电气柜实际信息,依据[电气柜title命名标准](#电气柜title命名标准)进行创建;
3. time:存放数据采集的时间,依据[时间命名标准](#时间命名标准)进行创建;
4. amplitude:局放数据信息。格式**Text**;
5. state:局放数据状态信息,依据[数据状态state标准](#数据状态state标准)进行创建;
9. dataTemperature表:存放温度数据信息。具有字段:
1. id:存放电气柜信息信息,依据[电气柜id命名标准](#电气柜id命名标准)进行创建;
2. title:存放电气柜实际信息,依据[电气柜title命名标准](#电气柜title命名标准)进行创建;
3. time:存放数据采集的时间,依据[时间命名标准](#时间命名标准)进行创建;
4. temperature:局放数据信息。格式**Text**;
5. state:局放数据状态信息,依据[数据状态state标准](#数据状态state标准)进行创建;
10. expection表:存放程序运行中的报错信息。具有字段:
1. expection_id:错误信息id;
2. expection_descript:报错信息描述;
3. expection_todo:报错信息标题;
## 2. 命名标准
### 1.变电所命名标准
变电所数据存放在数据库的**allPostcode**表中,具体内容参见数据库allPostcode表;
### 2.电气柜命名标准
电气柜数据存放在数据库的**allCabinet**表中,具体内容参见数据库allCabinet表;
### 3.电气柜设备命名标准
电气柜设备数据存放在数据库**allDevice**表中,具体内容参见数据库allDevice表;
### 4. 电气柜设备信息定义标准
电气柜设备信息数据存放在数据库**allDevice**表中,具体内容参见数据库allDevice表;
### 5.上下位机通信定义标准
参见胡若海;
# 三. 多线程
todo
# 四. 程序执行
## 1. 初始化
### 初始化数据库
1. 程序尝试打开位于`../../resource/database/`路径下的数据库`data`;如数据库未正常打开,会显示报错,并且由于整个程序的界面由数据库生成(如菜单栏中的具体电气柜、数据读取、主界面线路图等),所以程序会拒绝继续执行,并返回未正常找到数据库的错误;**程序终止运行**;
### 初始化变电所选择区
1. 程序成功打开数据库后,使用数据库中的**allPostcode**表内容获取所有变电所信息;
2. 根据当前变电所,在数据库**allPostcode**表中获取变电所编号,并在数据库**allCabinet**中获取当前变电所下的所有电气柜数据;
3. 根据当前变电所,在数据库**allDiagram**表中获取当前变电所的线路图名称,并加载到**显示内容**中;
4. 根据当前所选择的电气柜,在数据库**allDevice**表中查询当前电气柜中所有的设备信息;
### 初始化主界面
**视频**
1. 调用构造函数初始化相机:
```
分辨率:1280*720
帧率:30fps
格式:RGB888
```
2. 将相机拍摄置于相机线程中,采集到每帧图像后,通过信号将图像发送到主线程进行显示;并调用UDPSocket协议将图像发送给目标机器;
### 初始化电气柜操作界面
根据**变电所选择区**中的变电所、电气柜,从数据库**allDevice**表中获取当前电气柜中的所有设备信息,并对获取到的每个设备信息加载到**电气柜操作界面**中;
### 初始化数据图表显示界面
1. 使用数据库中`dataTemperature`表的数据对**数据显示界面**进行初始化;
* 依据当前选择的电气柜`id`对`dataTemperature`表中的数据进行筛选;*记为数据1*;
* 对于**数据表格显示界面:**
1. 遍历`nodeMap`表中的`node`信息,使用该信息对**显示节点筛选器**进行初始化;
2. 针对**显示节点筛选器**中的内容,对*数据1*进行进一步筛选,并显示在**数据表格显示界面**;
* 对于**数据折线图显示界面:**
1. 遍历`nodeMap`表中`node`信息,对上一步得到的数据进行每个`node`的数据查询,得到对应于当前电气柜、每个节点的所有温度信息和时间;
2. 使用**时间筛选器**中的起始时间对数据进行进一步筛选;
3. 将以上数据和时间在同一张数据折线图中进行显示;
## 2. 运行中
### 图像采集
1. 每30秒触发一次**图像采集线程**;
2. 采集到每帧图像后,通过信号将图像发送到主线程进行显示
### 图像上传
1. 将图像上传置于**图像采集线程**中;
2. 触发**图像采集线程**后,通过UdpSocket协议将图像发送给目机;
### 数据采集
1. 将温度采集置于**数据采集线程中**;
2. 通过自定义时间(默认为10分钟)触发线程后,通过Modbus协议采集数据,并记录当前时间;
3. 将采集到的数据保存到数据库中,依据`id`、`node`、`time`、`temperature`和`state`进行唯一存储;
### 数据上传
1. 将数据上传置于**数据采集线程**中;
2. 在采集到数据后将数据通过UdpSocket协议发送到目标机;(发送格式为QVector< QString >)
# 附件
## 1. 数据库命名标准
1. 变电所编号命名标准:
1. 字段名postcode;
2. 数据格式Text;
3. 命名规则:使用中华人名共和国邮编管理法中的邮编命名规则进行命名,参考变电所所在地区(精确到县、村)进行命名;
2. 电气柜id命名标准 :
1. 字段名**id**;
2. 数据格式**Text**;
3. 命名规则:前6位为供电段所属地邮政编码,第7位为该供电段中存在电气柜的地点(如:室内1,室内2……),第8,9位为该地点中电气柜编号;
3. 电气柜title命名标准 :
1. 字段名**title**;
2. 数据格式**Text**;
3. 命名规则:由该供电段提供现实实际名称;
4. 电气柜设备种类命名标准:
1. 字段名superclass;
2. 字段格式INTEGER;
3. 命名规则:
1. 数据为0:代表设备种类为标定板;
2. 数据为1:代表设备种类为按钮;
3. 数据为2:代表设备种类为按钮;
5. 电气柜设备子类型命名标准:
1. 字段名subclass;
2. 字段格式INTEGER;
3. 命名规则:
1. 当superclass为0时:
1. subclass为0:代表设备子类型为标定板;
2. 当superclass为1时:
1. subclass为0:代表设备子类型为带灯按钮;
2. subclass为1:代表设备子类型为不带灯按钮;
3. 当superclass为2时:
1. subclass为0:代表设备子类型为2挡旋钮左90度自锁;
2. subclass为1:代表设备子类型为2档旋钮左90度不自锁;
3. subclass为2:代表设备子类型为2档旋钮右90度自锁;
4. subclass为3:代表设备子类型为2档旋钮右90度不自锁;
5. subclass为4:代表设备子类型为3档旋钮自锁;
6. subclass为5:代表设备子类型为3档旋钮不自锁;
6. 电气柜设备名称命名标准:
1. 字段名title;
2. 字段格式Text;
3. 命名规则:使用该设备子类型进行命名;
7. 电气柜设备值命名标准:
1. 字段名value;
2. 字段格式INTEGER;
3. 命名规则:
1. 当superclass为0时:
1. 当subclass为0时,表示设备类型为**标定板**;
1. 只有一个值为0;
2. 当superclass为1时:
1. 当subclass为0时,表示设备类型为**带灯按钮**:
1. 只有一个值为0;
2. 当subclass为1时,表示设备类型为**不带灯按钮**:
1. 只有一个值为0;
3. 当superclass为2时:
1. 当subclass为0时,表示设备类型为**2档按钮左90度自锁**:
1. 值为0:旋钮当前角度为-90度;
2. 值为1:旋钮当前角度为0度;
2. 当subclass为1时,表示设备类型为**2档按钮左90度不自锁**:
1. 值为0:旋钮当前角度为-90度;
2. 值为1:旋钮当前角度为0度;
3. 当subclass为2时,表示设备类型为**2档旋钮右90度自锁**:
1. 值为0:旋钮当前角度为0度;
2. 值为1:旋钮当前角度为90度;
4. 当subclass为3时:表示设备类型为**2档旋钮右90度不自锁**:
1. 值为0:旋钮当前角度为0度;
2. 值为1:旋钮当前角度为90度;
5. 当subclass为4时:表示设备类型为**3档旋钮自锁**:
1. 值为0:旋钮当前角度为-90度;
2. 值为1:旋钮当前角度为0度;
3. 值为2:旋钮当前角度为90度;
6. 当subclass为5时:表示设备类型为**3档旋钮不自锁**:
1. 值为0:旋钮当前角度为-90度;
2. 值为1:旋钮当前角度为0度;
3. 值为2:旋钮当前角度为90度;
8. 时间命名标准
1. 字段名**time**;
2. 数据格式**Text**;
3. 命名规则:yyyy-MM-dd hh:mm:ss;yyyy为年份,MM为月份,dd为日期,年月日之间使用"-"连接;hh为小时,mm为分钟,ss为秒,时分秒之间用":"连接;年月日和时分秒之间用单个空格连接。
9. 数据状态state标准 :
1. 字段名**state**;
2. 数据格式**Text**;
3. 设立警戒值和警告值,若低于警戒值则为绿色,高于警戒值但低于警告值为黄色,嘎鱼警告值为红色;