# 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 界面组成 本程序界面主要由界面顶部的`变电所选择区`、界面左侧的`页面选择区`、界面下方的`状态监测区`,和界面中央的`显示和操作区`组成。 ![界面示意图](resource/image/screen_shot/界面示意图.png) 各组成部分的功能如下: ### 1. 变电所选择区 变电所选择区主要用于选择当前软件操作与监控的变电所、当前变电所的电气柜和在主界面显示的有关当前变电所的内容。、 ![](resource/image/screen_shot/变电所选择区.png) **变电所:** 用于选择软件操作与监控的电气柜: ![主界面-变电所](resource/image/screen_shot/主界面-变电所.png) 点击该控件,会弹出当前可选的变电所名称: ![](resource/image/screen_shot/主界面-变电所-展开.png) 选择变电所后,将从数据库加载与该变电所有关的所有电气柜和线路图内容。 **电气柜:** 用于选择当前变电所的电气柜名称: ![](resource/image/screen_shot/主界面-电气柜.png) 点击该控件,会弹出当前变电所可选的电气柜名称: ![](resource/image/screen_shot/主界面-电气柜-展开.png) 选择电气柜后,将从数据库加载所属该电气柜的所有设备信息。 **显示内容:** 用于选择当前变电所的线路图和视频和界面。 ![](resource/image/screen_shot/主界面-显示内容.png) 点击该控件,会弹出当前变电所可选的线路图和视频画面: ![](resource/image/screen_shot/主界面-显示内容-展开.png) 点击该控件后,通知主界面将显示内容改为该控件的当前所指内容。 ### 2. 页面选择区 功能切换栏属于自定义组件,其中包含4个部分,分别为`主页`、`操作`、`数据`、`设置`。点击控件会跳转到对应的主界面、操作页面、数据界面和设置界面。 ![](resource/image/screen_shot/页面选择区.png) 其中,主页对应主界面,主要用于显示当前变电所和线路图和视频画面;操作对应操作页面,主要用于对当前变电所的电气柜设备进行操作;数据对应数据页面,主要用于显示当前变电所的数据信息;设置对应设置界面,用于对当前变电所的配置信息进行更改。 ### 3. 显示和操作区 显示和操作区域位于本界面中心,与**页面切换区**进行了绑定,当用户在**功能切换栏**进行了点击操作后,显示和操作区域会显示对应的界面。 其中,可显示的页面包括**主界面**、**电气柜操作界面**、**数据显示界面**、**设置界面**。 ## 1.2 主界面 ### 1. 概述 ![主界面总览](resource/image/screen_shot/主界面.png) 主界面用于显示或操作当前变电所的**线路图界面**和**视频监控界面**,其内容由变电所选择区的显示内容决定。 ### 2. 线路图界面 线路图界面由手绘线路图组成,线路图中分为不可交互区和可交互区(绿色的线不可交互)。 线路图界面可以对其中红色区域进行鼠标的左键点击交互。当用户使用鼠标左键点击红色区域后,红色区域变为绿色区域,并弹出**操作提示**,用户可以根据弹出的操作提示对该区域进行**状态改变**等操作,并且该区域的颜色会在**绿色**和**红色**之间进行转换。 ### 3. 视频监视界面 用户对操作机器人上所连接相机的图像实时显示,并将采集到的图像通过UDPSocket发送给主机。 视频图像通常为RealSense iD415所拍摄,分辨率可调,最大支持1280*720像素,最高帧率60FPS。 ## 1.3 电气柜操作界面 ### 1. 概述 电气柜操作界面如下: ![](resource/image/screen_shot/操作主界面.png) 该界面为组态类型, 可以通过右上角的**新建电气柜**和**编辑电气柜**按钮对操作界面中的内容进行编辑,可以对设备控件进行位置和数据的修改。 使用鼠标对界面中设备进行点击会触发**设备动作**以弹出设备交互界面,以鼠标点击*旋钮22*设备为例,会弹出以下界面: ![](resource/image/screen_shot/设备操作.png) 该界面由程序自动生成,可交互控件为**Operator**中的按钮和最下方的**Cancle,Ok**按钮。 其中,**Operator**中的按钮表示当前设备可操纵的值,例如当前设备旋钮22为三档自锁旋钮,其旋柄拥有左、中、右三个状态的值,则**Operator**中的按钮分别对应这三个状态。用户点击**Operato**中的按钮后会触发消息传输机制,通过通信协议和定义好的设备动作流程控制机器人和机械臂的工作。 * 在空白处按住鼠标右键可以对整个设备界面进行拖动 ### 2. 新建电气柜 点击**新建电气柜**按钮后出现该界面,用于新建一个电气柜及其上面的设备数据, 该界面如下: ![操作-新建](resource/image/screen_shot/操作-新建.png) 在弹出的界面中会出现默认的电气柜设备图, 具体为包含一个**标定板设备**. 此时可以通过右上角的**新建设备**按钮添加设备, 具体界面如下: ![](resource/image/screen_shot/操作-新建-新建按钮.png) ![操作-新建-新建](resource/image/screen_shot/操作-新建-新建.png) 在**新建设备**时可以修改该设备的信息, 包括**设备类型**、**设备细分**、**相对于标定点偏移**、**设备坐标**等信息。具体有关设备信息定义见数据库章节。 修改**设备种类**和**设备细分**后, 将该设备选择为如下所示的设备: ![操作-新建-新建修改](resource/image/screen_shot/操作-新建-新建修改.png) 点击确认后, 界面会在屏幕中添加**新建的设备**, 并且在新建后通过点击该设备可以在**选中设备**中进行显示, 并将操作信息表示在**操作记录**中, 具体界面变为如下: ![操作-新建-选中](resource/image/screen_shot/操作-新建-选中.png) 在选中设备后, 点击**选中设备**中的**编辑设备按钮**可以对选中的设备信息进行编辑, 编辑设备界面与新建界面类似, 具体如下: ![操作-新建-选中编辑](resource/image/screen_shot/操作-新建-选中编辑.png) 此时可以对该设备信息进行编辑, 并在点击确定后更新该设备信息. 在所有操作完成后可以通过点击界面右上角的**保存电气柜**按钮对该界面中的所有设备信息进行保存. 点击**保存电气柜**按钮后会出现保存弹窗提示, **确认**按钮会保存所有设备信息到数据库, **取消**按钮会取消此次保存并返回到新建界面. 保存弹窗如下: ![操作-新建-保存](resource/image/screen_shot/操作-编辑-保存.png) * 在空白处按住鼠标右键可以对整个设备界面进行拖动 ### 3. 编辑电气柜 在操作主界面中可以通过点击右上角的**编辑电气柜**按钮对当前页面中的所有设备进行编辑, 点击**编辑电气柜**按钮后弹出的界面如下: ![操作-编辑](resource/image/screen_shot/操作-编辑.png) 该界面布局与**新建电气柜**界面布局类似, 不再介绍. ## 1.4 数据显示界面 ### 1. 概述 用于对数据库中的温度和局放数据进行显示,并根据日期进行图像显示。 左侧为温度、局放功能选择栏,上方为数据表示显示界面,下方为数据图显示界面 ![数据显示界面总览](resource/image/screen_shot/数据界面.png) ### 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**、**数据采集**等功能进行参数设置。 ![设置界面](resource/image/screen_shot/设置界面.png) # 二. 数据库 ## 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. 设立警戒值和警告值,若低于警戒值则为绿色,高于警戒值但低于警告值为黄色,嘎鱼警告值为红色;