mirror of
https://github.com/NanjingForestryUniversity/UpmatchinePassion-tomato.git
synced 2025-11-08 14:24:06 +00:00
132 lines
6.3 KiB
Markdown
132 lines
6.3 KiB
Markdown
# 果蔬智能装备及产业化
|
||
|
||
UpmatchinePassion-tomato
|
||
文件夹:
|
||
├─***CameraConfig***
|
||
├─debug
|
||
│ ├─bearer
|
||
│ ├─CameraConfig
|
||
│ ├─debug
|
||
│ ├─iconengines
|
||
│ ├─imageformats
|
||
│ ├─Log
|
||
│ ├─platforms
|
||
│ ├─release
|
||
│ ├─***Settings***
|
||
│ │ └─401d
|
||
│ ├─styles
|
||
│ └─translations
|
||
├─dll
|
||
├─***image***
|
||
│ ├─L
|
||
│ ├─R
|
||
│ ├─specImg
|
||
│ └─T
|
||
│ ├─bottom
|
||
│ ├─middle
|
||
│ └─top
|
||
├─***opencv***
|
||
│ ├─include
|
||
│ │ ├─CMakeFiles
|
||
│ │ ├─opencv
|
||
│ │ └─opencv2
|
||
│ │
|
||
│ └─Withcontrib
|
||
│ └─include
|
||
│ ├─opencv
|
||
│ └─opencv2
|
||
├─release
|
||
├─***rgbcamera_sdk***
|
||
│ ├─Includes
|
||
│ └─Libraries
|
||
├─***RT_SDK***
|
||
│ ├─include
|
||
│ ├─lib
|
||
└─**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,关于相机的 用户手册可以去海康官网下载。此次一共用到三个相机。
|
||
|
||

|
||
|
||
一共三个相机,分别为图中标的 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,具体图片如如所示。
|
||
|
||

|
||
|
||
光谱相机代码就当图一乐。如果有兴趣, 可以搜索.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端做服务器,机械手做客户机,端口号为 21123,IP任意,Qt会监听本地指定端口号下的任意IP,通讯报文格式为 [X:0;Y:0;A:0;ATTR:0;ID:0;],ATTR后面是等级,ID后面是果类0是番茄1是百香果。
|
||
|
||
与PLC通讯采用Modbus TCP协议,端口号为2000,IP为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协议读、写似乎是从指定寄存器地址的下一位地址开始 操作,验证过结果是对的,能正确读、写数据,但具体理论是否如我们假设的一样没去深 究。 |