# SAS视觉 **Repository Path**: sherlinz/sas-vision ## Basic Information - **Project Name**: SAS视觉 - **Description**: SAS的视觉组 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 1 - **Created**: 2021-12-03 - **Last Updated**: 2022-07-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SAS视觉 #### 介绍 SAS的视觉组代码库 #### Driver 摄像头驱动 Windows 和 Linux 平台的视觉识别。 Windows: 分成三个大部分: 输入 输出 相机调用 一个指针 这个指针指向地址后的一长串内存会被一幅图代替 图像识别 一个指针 所需的结构体数据 串口通信 所需的结构体数据 无 注:需要从mindVision官网上下载运行环境 http://mindvision.com.cn/rjxz/list_12.aspx?lcid=138 相机调用:需要利用mindVision提供的库和运行环境。去年我写好了一个能够调用相机实时处理图像输出坐标的程序 但是识别算法的效果并不好。关于相机的调用可以参考官方文档和gogogo文件夹(去年我写的) 图像识别: 1、也许大家能从简单入手,先做好第一个版本的总体视觉处理程序,验证系统可行性。 例如第一阶段我们可以先识别一个红色的正方形,这就足够了。例如,红色滤波,二值化,计算所有点坐标平均值。 而后这个把这个输出作为第一阶段的输出。直接发送给串口通信部分。 先把系统总体的可行性验证好,而后再去加上复杂的视觉处理算法。 2、也许大家能搞懂原理,用C语言实现所有的功能,实现轻易的跨平台和自主可控性。 有各种开源库,例如opencv,但是有时跨平台很难实现。有时会出现兼容性问题。 如果我们自己编写处理函数(当然包含适当的从库源代码复制粘贴而来(有的过于细的细节就不管了)), 就很容易跨平台(因为都是同一个文件夹里的C源代码)。 我们也会知道底层原理。也许科学院学生需要搞懂原理。 编译命令 gcc *.c -o runCam -static MVCAMSDK_X64.lib Linux: 注:需要从mindVision官网上下载运行环境 http://mindvision.com.cn/rjxz/list_12.aspx?lcid=138 下载完成之后sudo ./install.sh OpenCamera()开启摄像头 ReadCamera()返回一个cv::Mat类型的图像 CloseCamera()关闭摄像头 编译使用CMake #### Angelsolver 位置解算模块 #### Armor 装甲板识别 #### Energy 能量机关识别 #### Serial 串口通信(使用版) 2022年2月14日 说明:Windows平台已经测试通过。虚拟机Linux平台由于没有识别ttyUSB设备,虽然编译通过了,但暂未测试。 NUC和主控板交互可以使用串口通信。 电脑上有操作系统管理端口设备,通信协议复杂,有许多参数需要配置。然而为了方便使用,可以将机器人所需的串口通信函数封装成类,而后在主函数中只需简单的方法就可调用。此版本的串口通信函数使用了上交视觉开源的串口通信部分。做了一些修改和配置。下面描述串口通信的**使用方法**。也会介绍调试时需要的选项。 代码已经通过Windows平台的测试。 ##### 复制代码到工程文件 这里有三个文件是串口通信所需的。将它们复制到工程文件夹中。其中platform.h是串口参数和运行平台的设置。serial.cpp包含串口通信串口类源代码,serial.h包含串口类的声明。 ![VScode里的界面](.\imageForMarkdown\image-20220214130122523.png) ##### 包含头文件并新建串口对象,在主函数中使用串口发送函数 ###### 总程序 下面以一个简单的main发送函数为例,展示在设置好串口号后(串口号设置的过程参考本文档的*配置方法和所需的调试软件* 部分)如何在自瞄代码中使用串口通信。 ```c++ #include #include "serial.h" using namespace std; Serial serial(115200); // 串口对象 int main() { char dataToSend[6]={1,2,3,4,5,6}; while (1) { serial.WriteData((const unsigned char *)dataToSend,6); } return 0; } ``` ###### 程序部分说明 需要在使用串口通信的地方包含串口头文件。 ```c++ #include "serial.h" ``` 这一句是新建串口对象,波特率115200。只有波特率相同才能通信。 ```c++ Serial serial(115200); ``` 在编写好的自瞄程序或者各种想发送数据的地方调用发送函数。其中dataToSend为待发送数据的地址,6表示发送数据的字节数。根据不同的数据结构大小需要使用不同的值。 ```c++ serial.WriteData((const unsigned char *)dataToSend,6); ``` 这里为了展示发送状态,在while(1)循环内使用了发送函数。NUC实际工作时,会在识别完成后发送数据。 ###### 编译命令 而后我们得到了如下的文件 ![所有文件](.\imageForMarkdown\image-20220214133539819.png) 使用如下命令编译 ``` g++ *.cpp -o testSerial ``` ###### 运行结果 当串口未连接上时,会有error出现 ![image-20220214133709609](.\imageForMarkdown\image-20220214133709609.png) 当插上后,会提示连接成功 ![image-20220214133756645](.\imageForMarkdown\image-20220214133756645.png) 这里不一定是com7,com7是通过串口调试助手找的端口号。在重新连线时,可能需要重新改端口号。 ###### 实际模块工作状态 USB转串口模块插到电脑上得到供电时,亮灯如下。只有一个电源灯。 ![USB串口模块上电](.\imageForMarkdown\IMG_20220214_132703.jpg) 当程序正确占用了当前串口并且通过该串口发送数据时,模块亮灯如下。包括一个电源灯和一个发送指示灯。 ![USB串口工作](.\imageForMarkdown\IMG_20220214_132715.jpg) ##### 串口配置方法和所需的调试软件(Windows平台) 串口比较重要而常常修改的参数有串口号、波特率、停止位、奇偶校验等。实际使用中,当波特率、停止位、奇偶校验等已经约定好了,写在了代码中时,容易变的就是串口号了。当USB串口模块插到了电脑上,操作系统会为其分配一个端口号。插入不同的位置会有不同的号码,是否使用拓展坞也会影响端口号。我们使用的是搭载CH340转换芯片的串口模块。 使用串口通信助手查看当前电脑上的串口号。Windows平台上,我们可以使用UartAssist。(干脆直接把它放在文件里)下载一个程序如图 image-20220214143512757 当转换模块插入电脑的时候,左边下拉菜单可以看到 USB-SERIAL CH340。是com7,那么我们就去在程序的platform.h中修改定义端口号为7。 ![image-20220214143630826](.\imageForMarkdown\image-20220214143630826.png) ```c++ #ifndef PLATFORM_H #define PLATFORM_H #define Windows #ifdef Windows #define USB_SERIAL_COM_NUMBER 7 #endif #endif ``` 而后编译运行,可以正常通信了。 ##### 串口配置方法和所需的调试软件(Linux平台) 由于虚拟机上的Linux系统没有识别ttyUSB设备,这个方法的通信没有测试成功。但是能够编译通过。在Linux平台编译前,需要先将platform.h中的平台改成Linux。 ```c++ #ifndef PLATFORM_H #define PLATFORM_H // #define Windows #define Linux #ifdef Windows #define USB_SERIAL_COM_NUMBER 7 #endif #endif ``` 不需要手动修改串口号:Linux版本可以直接搜索ttyUSB并打开。之后用NUC的原生Linux平台直接测试。 #### Imagetest 利用官方的数据集做输入,在没有相机的时候可以作为代替输入 在可执行文件imagetest旁边放入解压过的那个叫rmcvdata的数据集即可