1. 引言
在当前的天文科普教育领域,如科学馆、天文馆、学校等科普场所,用于视差测量的演示模型和装置较为匮乏。而且现有的视差测量演示装置大多依赖于原理图或者静态模型,缺乏互动性和实时模拟能力;不能真的去模拟地球公转视角变化下恒星位移变化,难以使观众,尤其是学生对周年视差有充分的理解。此外,由于操作复杂或自动化程度不高,教师和讲解员在使用这些资源进行教学时,往往需要额外的解释和辅助材料,影响了教学质量。本装置的设计,需要涉及机械结构设计、单片机与电机驱动器和电脑通信、目标检测与跟踪、人机交互页面搭建与单片机交互等内容;国内外学者针对这些领域的内容,展开了广泛研究。
刘文龙基于STM32F103和MODBUS RTU协议开发了多驱动器协同运动控制系统,通过电机专用驱动芯片实现精准控制[1];李琳等设计了步进电机实时监测系统,结合STM32实现了电压、频率等参数的动态采集[2]。蔡淼和李金承等分别研究了MODBUS RTU协议和RS485总线在多设备数据传输中的应用,为系统通信架构提供了参考[3] [4]。谭斌等创新性地将YOLO V5与视差神经网络结合,通过双目摄像头图像和几何关系优化测距精度[5];费杰等通过串口通信实现了DR设备三维模型的控制,其3D Max建模与Unity驱动的流程为本研究提供了技术模板[6];狄磊开发的普通车床虚拟仿真系统详细探讨了UI设计、模型动态控制等关键问题[7]。刘玉均和冯雨轩等分别基于Unity 3D开发了工业机器人实训系统和果园监控系统,验证了STM32与UNITY通过串口/TCP-IP通信的可靠性[8] [9]。Wang X等将STM32与传感器、YOLO算法结合,开发了智能消毒控制系统,并应用动态调节策略,进一步拓展了目标检测的工程应用场景[10]。Xia K等人探讨了滑环供电、电池供电和旋转变压器供电等电源、信号交互的优劣,为本文旋转部件供电方案提供参考[11]。Fajrianti ED等通过YOLO与UNITY的交互,实现了基于深度学习的实时目标识别,验证了跨平台整合的可行性[12]。
本文重点解决演示装置的多设备协同控制、实时目标检测与虚拟仿真交互等关键问题。系统采用STM32作为主控芯片,通过RS485总线和MODBUS RTU协议控制步进电机,驱动测距组件进行精确位移和角度调整。在PC端,通过串口通信实现STM32与UI之间的数据交互,由Pycharm运行YOLO V5算法实时检测目标物体并提取坐标,再通过Unity 3D构建三维模型,动态展示测量过程及数据。
2. 总体方案设计
2.1. 三角测距方法
视差,是指当观察者从两个不同位置观察同一个远方物体时,该物体相对于背景的相对位置会发生的微小变化。如果将地球在轨道上的两个位置A与B、太阳O和恒星E看作一个三角形的三个顶点,通过地球到太阳的平均距离R、地球两个位置与太阳连线的夹角∆θ1、测量到的视差角∆θ2和观测恒星的仰角θ3,可以利用三角函数计算出恒星到地球的实际距离d。三角关系平面图如图1所示,其计算公式为
(1)
(2)
(3)
其中,∆θ1通过步进电机两个位置时的不同角度参数θ1和
做差求得,∆θ2通过云台处编码电机的两个位置时的不同角度参数θ2和
做差求得。
Figure 1. Parallax measurement plan of any two positions
图1. 任意两位置视差测量平面图
2.2. 装置运行模式
在装置上电后进入待机模式,地球模型在中心电机的带动下,由当前位置以6˚/s的速率逆时针转动回到春分点,本装置定其为起点;另外,按照24节气将360˚进行划分,用来指示地球运动的位置,其模型如图2所示;在此状态下,可进行机械原点的校准复位,以消除长时间运转过程累积的电机、舵机读数偏差。
当按下“手动测量”按钮,则由“待机模式”切换为“手动测量模式”,此模式能为科普工作人员提供便捷的视差测量实操演示实验,手动测量模式流程图如图3所示。在此模式下,可以在UI界面上对地球位置和天文望远镜的指向进行调整,并使所需测量目标位于望远镜视野中央;这时可按下“移动完成”按钮,开发板读取当下中心电机和云台电机的位置和角度,分别记为A、θ1和θ2。继续通过软件移动地球位置和天文望远镜指向,当第二次按下“移动完成”按钮,开发板读取该时刻中心电机、云台电机和
Figure 2. Model diagram of parallax measurement demonstration device
图2. 视差测量演示装置模型图
Figure 3. Flowchart of manual measurement mode
图3. 手动测量模式流程图
舵机的位置和角度,分别记为B、
、
和θ3。并在UI界面显示地球位移及天体与地球距离的数值。在测量结果显示1 min无操作后,自动退出“手动测量模式”,进入“待机模式”。在待机模式下,按下UI界面的任意节气按钮,则切换为“自动测量模式”,同时地球由当前位置以6˚/s的速率逆时针转动到该节气的预设位置并停下。
自动测量模式下,开启YOLO程序对物体进行识别与跟踪,控制云台使得测量目标位于望远镜视野中央后。按下“移动完成”按钮并按下第二个节气按钮,地球转动到该节气的预设位置,并且天文望远镜画面跟踪天体并将其居中后,开发板读取该时刻中心电机、云台电机和舵机的角度,自动测量模式流程图如图4所示。完成两个位置的测量,系统自动计算视差测量结果于软件相应位置,以下介绍完成本系统的硬件与软件设计。
Figure 4. Flowchart of automatic measurement mode
图4. 自动测量模式流程图
3. 系统硬件设计与实现
3.1. 机械结构设计
装置简化后是一个简单的中心铰链–杆机构,86闭环步进电机安装在装置的中心部分,该部分就是装置主要的动力部分,通过五通联轴器、杆固定太阳模型所在的平面,并带动地球、望远镜部分进行旋转。为了计算从不同位置观察待测目标的方位角和高度角变化,需要设计一个能够控制2个自由度转动和获取当前角度参数的云台,可以通过编码电机DM3505、舵机SG90和摄像头来实现。通过在地球位置和主轴位置各安装一个导电滑环来解决旋转平台的电交换问题,装置简化建模图如图5所示。
Figure 5. Simplified modeling diagram of the device
图5. 装置简化建模图
3.2. STM32F103C8T6主控模块
主控模块选择STM32F103C8T6开发板,以此满足1个ADC数模转换器、2个USART串口和3个定时器的调用需求,主控模块电路图如图6所示。
Figure 6. Master module circuit diagram
图6. 主控模块电路图
其中ADC模块将双轴按键摇杆输入进来的模拟信号转换为0~255的数字信号;USART1为STM32与AS5048A驱动器之间的串口通信,USART3为STM32与PC端UI之间的串口通信;定时器Timer2是系统的总中断程序,每1 ms溢出一次,为PWM信号、串口通信和ADC提供计数服务,定时器Timer4是补充Timer2的PWM引脚不足需求,定时器Timer3在每次需要长时间的等待程序中开启,比如在自动测量模式的某一步骤中,如果长时间无动作,则由Timer3进行打断,切换回待机模式;主控系统框架如图7所示。
Figure 7. Main control system framework diagram
图7. 主控系统框架图
3.3. 电机驱动方案设计
86闭环步进电机的DM860H驱动器之间需要设计电路对脉冲信号、方向信号和使能信号进行处理,才能使STM32通过PWM信号输出脉冲对驱动器进行控制,如图8所示采用共阳极接法进行连接,驱动器脉冲细分选择8000,此时单片机输出脉冲与驱动器接收脉冲呈1:1关系,此时STM32输出1个脉冲中心电机转动0.09˚;由于中心电机没有磁编码器,无法获取电机实时单圈绝对角度,所以通过对STM32输出的脉冲次数,来计算电机现在的转动位置,即每输出4000次脉冲信号,则中心电机转动360˚。
Figure 8. Common anode wiring diagram of STM32F103C8T6 and DM860H
图8. STM32F103C8T6与DM860H的共阳极接线图
编码电机DM3505的AS5048A驱动器与STM32进行RS485通信时,需要将数据打包成16进制的数组形式,包含协议头、包序号、设备地址、命令码、数据长度、数据字段和CRC16校验码。主要使用三个指令对编码电机进行控制:命令码0X0B为读取电机系统实时数据;命令码0X54为电机速度闭环控制,输入的参数为int16_t类型,数值范围为-32768~32767,当参数值为负数时,电机反转;命令码0X56为电机相对位置闭环控制,电机基于当前位置相对运动的角度;如表1所示。当AS5048A接收命令码为0X0B的数据包时会回传当前单圈绝对值角度、速度、电源电压等数据如表2所示。
Table 1. Format of the data packet for the 0X56 command code
表1. 0X56命令码的数据包格式
序号 |
字段名称 |
字节 |
内容说明(数据) |
DATA[0] |
协议头 |
1 |
0x3E |
DATA[1] |
包序号 |
1 |
0x00-0x0FF |
DATA[2] |
设备地址 |
1 |
0x01~0x20 |
DATA[3] |
命令码 |
1 |
0x56 |
DATA[4] |
数据包长度 |
1 |
0x02 |
DATA[5] |
相对位置低字节 |
2 |
相对运动的Count值 int16_t数据类型; 电机旋转一圈的Count值为16384 |
DATA[6] |
相对位置高字节 |
DATA[7] |
CRC16校验低字节 |
2 |
DATA[0]~DATA[6]字节CRC16校验 |
DATA[8] |
CRC16校验高字节 |
Table 2. The data packet format returned by AS5048A
表2. AS5048A回传的数据包格式
序号 |
字段名称 |
字节 |
内容说明(数据) |
DATA[0] |
协议头 |
1 |
0x3C |
DATA[1] |
包序号 |
1 |
0x00~0x0FF |
DATA[2] |
设备地址 |
1 |
0x01~0x20 |
DATA[3] |
命令码 |
1 |
0x0B |
DATA[4] |
数据包长度 |
1 |
0x0D |
DATA[5] |
单圈绝对值低字节 |
2 |
电机单圈绝对值角度(uint16_t) Angle˚ = val*(360/16384) |
DATA[6] |
单圈绝对值高字节 |
DATA[7] |
多圈绝对值低字节1 |
4 |
电机多圈绝对值角度(int32_t) Total Angle˚ = val*(360/16384) |
DATA[8] |
多圈绝对值字节2 |
DATA[9] |
多圈绝对值字节3 |
DATA[10] |
多圈绝对值高字节4 |
DATA[11] |
机械速度低字节 |
2 |
电机速度(int16_t) 单位为0.1Rpm |
DATA[12] |
机械速度高字节 |
DATA[13] |
电源电压 |
1 |
电源电压 = val*0.2 (V) |
DATA[14] |
系统电流 |
1 |
系统电流 = val*0.03 (A) |
DATA[15] |
系统温度 |
1 |
系统温度 = val*0.4 (℃) |
DATA[16] |
系统故障码 |
1 |
[Bit0]:电压故障 [Bit1]:电流故障 [Bit2]:温度故障 |
DATA[17] |
电机运行状态 |
1 |
0:关闭状态 1:开环模式 3:速度模式 5:位置模式 |
DATA[18] |
CRC16校验低字节 |
2 |
DATA[0]~DATA[17]字节CRC16校验 |
DATA[19] |
CRC16校验高字节 |
4. 系统软件设计
4.1. 星星检测模型训练
作为室内的三角视差演示装置,为了贴近于天文中对远距离恒星进行视差测距,所以购买一些星星模型作为测距的参考目标,如图9所示,并在YOLO模型的训练中,将星星模型按形状分别标注为starA (雪花片)、starB (八角星)和sphere (圆球),吊顶行星灯标注为starC。并将starA悬挂于装置的正上方,作为自动测量演示模式的默认测距目标,其他星星固定于房间的各个角落。
(a) (b)
(c)
Figure 9. Star model (a) starA, (b) starB and sphere (c) starC (image source: Taobao)
图9. 星星模型(a) starA,(b) starB和sphere (c) starC (图片来源:淘宝)
LabelU是一个图形化标注工具,用于为图片中的目标物体绘制边界框并生成对应的标签文件;YOLO要求标签文件为.txt格式,每行包含一个目标的类别编号和归一化的边界框坐标,包含class_id、x_center、y_center、width和height,每标注一张图片都会生成同名的.txt文件。通过拍摄实物图和在网络上搜集相关的星星模型的图片,将搜集的图片按80%训练集、20%验证集划分到train和val文件夹中,并创建star.yaml文件用来指向训练集和验证集的图片目录和标注类别数量名称。
在YOLO V5模型训练中,workers为设置数据加载的线程数,能够加快数据预处理和加载速度,但值过大也会增加内存负担;batch-sizew为设置单次迭代训练的样本数,值越大训练越稳定,但需要更多显存,而值越小收敛方向可能震荡;epochs为设置训练轮次,不足会导致欠拟合,过多会导致过拟合。使用指令--data data/star.yaml --workers 4 --batch-size 16 --epochs 100 --device 0设置数据加载的线程数为4、每个批次的样本数为16、训练轮数为100轮对star文件下的train和val文件进行训练。
初始阶段epochs0~epochs10时,评估指标precision、recall和mAP均全为0,可能是因为模型刚开始学习,预测能力弱,模型未学习到有效特征;此时验证损失val/box_lossh和val/cls_loss快速下降,高学习率快速收敛。在突破阶段epochs15~epochs25时,recall从0.11升到0.63;mAP@0.5出现首次跃升,在23轮由0升到0.235;验证损失val/obj_loss在第20轮附近反弹,呈现过拟合风险。在优化阶段epochs30~epochs50时,precision从0.18升到0.87,精度大幅提升;而mAP@0.5:0.95由0.017升到0.286,定位能力增强;在收敛阶段epochs60~epochs99,mAP@0.5由0.59平稳上升至0.84;验证损失val/box_lossh和val/cls_loss稳定下降,学习率衰减;如图10所示。
recall上升早于mAP,说明早期检测框质量差;在第20轮附近出现的obj_loss验证损失震荡,后续需要增加数据多样性;epochs98的mAP@0.5 = 0.83501与epochs99相近但obj_loss更低,训练轮数100轮基本满足需求,但仍需要对比epochs95~epochs99多模型测试。
Figure 10. Result figure of model training
图10. 模型训练结果图
类别数量分布图展示数据集中各个类别的样本数量,帮助判断是否存在类别不平衡问题,理想情况下,各类别的样本数量应相对均衡。starC和sphere的柱状图明显低于其他类别,说明该类别样本不足,可能导致模型对其学习不充分。目标宽高相关性图通过散点图展示目标宽度和高度的相关性,分析目标的整体形状分布。如果点集中在对角线附近,说明目标多为方形。后续进行模型训练仍需增加样本数量,使各类别的样本数量相对均衡,同时使用多尺度训练,增强模型对不同尺寸的适应性。类别数量分布图和目标宽高相关性图如图11所示。
(a) (b)
Figure 11. Category quantity distribution chart and target width-height correlation chart. (a) Category Quantity Distribution Chart; (b) Target width-height correlation graph
图11. 类别数量分布图和目标宽高相关性图。(a) 类别数量分布图;(b) 目标宽高相关性图
Precision-Recall曲线图展示模型在不同置信度阈值下,精确率(Precision)和召回率(Recall)的权衡关系;召回率表示模型能检测出多少真实目标,精确率表示模型预测为正的样本中,有多少是真的正样本,两者均是越高越好。模型训练的整体表现为mAP@0.5 = 0.832,模型检测效果中等偏上;其中starC曲线较高,说明该类别检测效果很好(AP = 0.995),sphere曲线较低,可能该类别样本较少或特征不明显(AP = 0.698),主要原因还是样本量少导致的,如图12所示。
Figure 12. Precision-Recall curve chart
图12. Precision-Recall曲线图
F1-Confidence曲线图展示F1分数,即Precision和Recall的调和平均数,随置信度阈值的变化;其中模型预测的置信度(Confidence)阈值设置范围是0~1,F1分数范围也是0~1,但F1分数越高越好。在图13中可以看出,当置信度 = 0.484时,F1分数达到最高0.74;starA和starC的F1分数较高,说明该类别分类更准,starB和sphere的F1分数较低,可能误检较多。检测样图如图14所示。
Figure 13. F1-Confidencel curve chart
图13. F1-Confidence曲线图
Figure 14. Object recognition sample image
图14. 物体识别样图
4.2. UI设计
UI框架在Unity 3D中搭建,需要将STM32与UI进行串口通信,将中心电机、云台电机和舵机的角度参数传输到UI当中,同时将UI上的“移动完成”功能按键和节气位置按键信息回传至STM32,开启下一步骤。由于Pycharm中运行的YOLO V5模型使用的是Python框架的代码,需要通过TCP协议与UI中的C#框架进行通信。UI中的窗格主要分为4个,左上角云台的高度角和方位角,左下角显示测距结果,右上角显示电脑摄像头画面,右下角显示虚拟仿真的3D模型,将于后续的装置图中呈现。
在UI中需要嵌入摄像头画面作为测距实时影像,同时YOLO V5在物体检测的过程中也需要调用摄像头;但Unity和Pycharm同时访问同一个摄像头设备,会导致摄像头资源冲突,摄像头设备在同一时间只能被一个程序独占访问。为解决这一问题,使用虚拟摄像头软件(OBS Virtual Camera)将摄像头画面共享给这两个程序,并在两程序中指定使用虚拟摄像头。
为了在右下角的窗格中实时显示3D模型,需要创建一个太阳模型和地球望远镜模型,望远镜架设在地球上,围绕着太阳进行公转,将设计树下的已经悬挂好RawImage组件的CameraModel视角正对3D模型;望远镜的方位角和高度角变化,即是云台的方位角和高度角变化,而地球公转的角度,模拟的是中心电机的转动角度。地球和望远镜创建重合的两份,在第一个节气位置时,第一组地球和望远镜的位置在该帧下停止,另一组地球和望远镜继续运动到第二节气位置。而在太阳系统模型周边,创建一圈24节气按钮,作为地球运动位置指示和运动位置选择按钮,并将按下的节气参数回传至STM32中进行处理,计算两节气位置地球距离,Unity中的日地模型和24节气3D模型,如图15所示。
Figure 15. The Sun-Earth model and the 24-solar-term 3D model
图15. 日地模型和24节气3D模型
5. 系统测试与分析
在装置正上方悬挂starA,在一侧稍远的天花板上悬挂starB和sphere作为测试,场地布置如图16所示。连接电源开机后,装置进入待机模式,点击“春分”按钮让云台运动到起点,且作为第一个测距位置点并开启自动测量模式。
在UI中点击键盘方向键,将摄像头中心对准starA,点击确定后,STM32读取中心电机、云台电机和舵机角度;摄像头指向位置和UI页面如图17所示,在UI页面中可以看到,右上角摄像头窗格中,已经将starA居中于摄像头画面中央,右下角3D模型中,地球的位置恰好在“春分”位置停留。
点击第二节气位置,此处以秋分为例,在UI中第一组地球和望远镜会留在原来位置,由第二组地球和望远镜进行运动。待装置云台运行到该位置后,重新调整摄像头角度,使摄像头画面中心正对starA;点击确认后STM32读取此时中心电机、云台电机和舵机角度,同时在YOLO V5物体检测下,识别出starA,将starA标注在“天体与地球距离”左侧,并计算结果;回顾图1中,由于此时中心电机旋转角度
Figure 16. Site layout plan
图16. 场地布置图
(即∆θ1)为180˚,云台电机一直是做向心的圆周运动,故角度无变化;且线段AE和线段D重合,AE长度的两倍与此时的直径D相等为80 cm,读取的舵机高度角为75˚;通过计算得地球模型与starA的距离d加上摄像头旋转中心离地高度27.5 cm为200.2 cm。为验证距离d的准确性,需要测量starA离地球模型平面的垂直距离,再通过正弦角的换算得到垂直高度为193.4 cm。
(a) (b)
Figure 17. Diagram of the first Solar Terms device positioning (a) Camera pointing position (b) UI page
图17. 第一节气位置装置图 (a) 摄像头指向位置 (b) UI页面
第二个节气位置确认后,实际测量高度和UI中角度、距离显示如图18所示,其中在实际测量高度图片中,starA正对着卷尺的水平高度约为193.4 cm,与之前换算出的垂直距离相符;UI页面中,右上角的窗格已经将starA居于摄像头画面中央,右下角3D模型窗格中,有两个地球模型,左边“春分”旁边的地球是第一节气位置留下的,而右边停留在“秋分”位置的地球模型,则是第二节气位置留下的;两个望远镜均射出一条红色实线,交汇点代表starA的位置。
(a) (b)
Figure 18. Diagram of the second Solar Terms device positioning (a) Actual measured height (b) UI page
图18. 第二节气位置装置图 (a) 实际测量高度 (b) UI页面
由于摄像头旋转中心离地高度和starA的垂直高度均是用卷尺测量,造成误差较大,后续改进将使用更精密的仪器进行修正。
6. 结论
本研究设计了一种以STM32为核心控制器的视差测量演示装置,此装置以步进电机、编码电机、舵机和摄像头对日地模型和天文望远镜进行模拟,采用CRC16/MODBUS校验来保证数据传输的准确性,克服了步进电机接收脉冲实现转动但无法获取当前转动角度的缺点;运用了导电滑环对旋转部件进行供电和信号传输,简化了结构复杂度;通过在Unity中设计UI页面和虚拟仿真模型,对实物装置进行实时位置模拟,在UI中实现人机交互,提高装置的互动性和趣味性;同时增加物体检测和跟踪功能,让测距过程更加智能化,也验证了Python语言框架和C#语言框架下通信的可靠性。
后续研究仍需提高装置测距精度,拓展物体检测目标类别,让适配场合更加广阔;完善UI框架的搭建,创建电脑的可执行.exe程序。目前使用的换算公式并不是很准确,特别是遇到两节气位置与待测星体视线重合或比较接近的情况不适用,而且两次运动位置,舵机角度不一定完全等同,导致距离换算误差较大,这也是之后改进所要着重处理的方面。
基金项目
本研究项目开发受云南千星天文台和东莞朱雀权衡教育投资有限公司资助。
NOTES
*通讯作者。