Compare commits

..

No commits in common. "master" and "v3.0" have entirely different histories.
master ... v3.0

118
README.md
View File

@ -1,106 +1,12 @@
# 果蔬智能装备及产业化 # 果蔬智能装备及产业化
UpmatchinePassion-tomato 此代码涉及海康威视面阵相机**MV-CS050-10GC**
文件夹:
├─***CameraConfig*** 光谱相机为无锡谱世界生产的RT10。
├─debug
│ ├─***Settings*** 与机械手通讯采用tcp-ip协议主要发送分级结果给机械手此部分代码为滕广、方晓东、徐耀创作。
├─***image***
│ ├─L 与称重模块通讯以及光谱相机筛选谱段以及拼接皆出自徐耀之手此人精通C++,师弟有不懂就问徐耀师兄。
│ ├─R
│ ├─specImg
│ └─T
│ ├─bottom
│ ├─middle
│ └─top
├─***opencv***
├─***rgbcamera_sdk***
├─***RT_SDK***
└─**src**
## 0 引言
此代码涉及海康威视面阵相机**MV-CS050-10GC**
光谱相机为无锡谱世界生产的RT10**settings文件夹一定要放在debug目录下**。
与机械手通讯采用tcp-ip协议主要发送分级结果给机械手。
与称重模块通讯以及光谱相机筛选谱段以及拼接。
**注意依赖文件在release里面是v3.0版本,记得下载**
## 1 细节
福建泉州番茄-百香果 Qt 项目代码,应该是 Qt 人的入门级代码。
代码部分一共有三部分camera^ thread和widget, camera主要内容是相机负责相 机的初始化和参数设置thread主要内容是线程负责各个线程的工作和启停widget主要内容是界面按钮和信号的处理。
下面进行各个分部分介绍(完整代码都有注释,所以此文档重点介绍一些难理解的点)
### 1.1 Camera
此次RGB相机选用的是海康的面阵相机相机型号为MV-CS050-10GC,关于相机的 用户手册可以去海康官网下载。此次一共用到三个相机。
![1721802095232](C:\Users\PC\AppData\Roaming\Typora\typora-user-images\1721802095232.png)
一共三个相机,分别为图中标的 14、15 和 17以传送带前进方向为正方向17 为右 侧相机14 为左侧相机15 为顶部相机。因为三个相机,就得确定三个相机的连接顺序, 所以选择根据相机第四位ip来确定顺序100为右侧相机150为左侧相机200为顶部相 机,以下为代码具体实现。
```c++
switch (ip4)
{
case 100:
MV_CC_CreateHandle(&camera_handle1, device_list.pDeviceInfo[i]);
break;
case 150:
MV_CC_CreateHandle(&camera_handle, device_list.pDeviceInfo[i]);
break;
case 200:
MV_CC_CreateHandle(&camera_handle2, device_list.pDeviceInfo[i]);
break;
default:
break;
}
```
其余代码可参考海康相机调试软件MVS自带的开发指南里面有完整的抓图程序以及 各个函数接口定义。路径为D:\MVS\Development\Documentations具体图片如如所示。
![1721802263676](C:\Users\PC\AppData\Roaming\Typora\typora-user-images\1721802263676.png)
光谱相机代码就当图一乐。如果有兴趣, 可以搜索.bil编排格式的光谱数据即可理解数据筛选。
### 1.2 Thread
线程代码部分开头为三个RGB相机的回调函数主要功能是相机传输图像的数据代 码层面接受图像数据并处理,具体内容看海康相机的用户指南,里面有关于回调的详细解释。
此次项目一共开设了三个线程分别为ProcessImg (处理光谱相机数据线程)、 RecvThread (接受python端返回的数据线程)和SendThread (给python端发送数据线程) 所有线程相关的代码都在各个线程类的Run函数内因为线程在启动后会执行一次他对 应Run函数每个线程都写了 while (1)死循环,为的是让线程一直处于监听状态,一旦满 足处理要求就立马进行处理。线程开启代码在widget.cpp内具体代码如下。
//开启线程也就是执行一次对应线程的**run()**函数在**thread**里面有 即执行三个线程的**while** **(1)***死循环*一直监听
```c++
processimg->start();
sendthread->start()
recvthread->start()
```
发送和接收线程内对于数据有对应的协议位具体协议内容在python端其中发送 线程内,对于发送的判断条件为什么是: topImgTQueue>15因为从RGB相机第 一次触发到称重模块之间的果托数量正好是16所以要再第16次触发后开始发送这样 读取到的python返回值和读取到的称重数据就能对应上。发送线程为什么要数据对齐因 为三个RGB相机在空间上是有错位的而三个相机又是同时触发所以相机的图片需要进 行数据对齐,既删除掉一些多余的图像。
其余代码都是常规代码问ChatGPT就可以。
### 1.3 Widget
Widget主要是负责一些界面上的信号和函数这部分重点应该是信号和槽函数的 connect函数的理解可以自行写一些信号和槽函数的代码这样可以更深入了解信号和 槽函数对应的关系。
Widget内涉及到两个协议分别是跟机械手通讯的协议和跟PLC通讯的协议。
与机械手通讯采用Socket TCP/IP协议Qt端做服务器机械手做客户机端口号为 21123IP任意Qt会监听本地指定端口号下的任意IP,通讯报文格式为 [X:0;Y:0;A:0;ATTR:0;ID:0;]ATTR后面是等级ID后面是果类0是番茄1是百香果。
与PLC通讯采用Modbus TCP协议端口号为2000IP为192.168.101.110,从机地 址为1, Qt端做主站PLC做从站分为收跟发Qt端会给PLC发送等级信息和编号信 息Qt端会从PLC读取称重数据。跟PLC商量称重数据放在寄存器40001 上, PLC负责 写Qt负责读取编号放在寄存器40002等级信息放在40003,4XXXX寄存器在PLC端是 16位的数据寄存器所以所有读取格式都采用uint16_t,但代码中读、写的地址是40000 和40001,这是因为Modbus TCP协议读、写似乎是从指定寄存器地址的下一位地址开始 操作,验证过结果是对的,能正确读、写数据,但具体理论是否如我们假设的一样没去深 究。