# LED_locate **Repository Path**: caishuyangyang/led_locate ## Basic Information - **Project Name**: LED_locate - **Description**: LED-光电池阵列实现物体定位 - **Primary Language**: Python - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-02-22 - **Last Updated**: 2023-03-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # LED-光电传感器阵列定位 ## 训练数据采集 将小球悬挂在支架上,通过步进电机调节x,y坐标,测量范围为[0,9],步长为一个单位,通过调节绳长调节z坐标,测量范围为[0,2],步长为一个单位;每个位置测量多组数据,每测量完一个坐标点,将LED熄灭一定时间,将小球移动到下一个位置时重新点亮 ## 训练数据处理 在处理测量数据时,我们小组发现数据存在一些噪点,我们小组采取如下策略消除噪点: + 对同一个位置的多组数据使用均值滤波处理 + 用原数据减去滤波后的数据,并计算绝对值 + 设定一个阈值,当绝对值大于该阈值时认为这个数据是噪点 + 从原数据中删去噪点数据,再次使用均值滤波处理,得到最后结果 最后将得到的特征数据归一化处理,得到训练数据 主要文件:`txtData\\txt2csv.py`,`oridata\\deal_tool.py`,`_01XlsReader.py` ## 网络搭建 我们添加了两层隐藏层,节点个数均为100,激活函数选用 ReLU 函数,同时为了防止模型的泛化能力随层数的增加而下降,我们在层与层之间添加了残差块: ```python class ResBlock(nn.Module): ''' 残差块 ''' def __init__(self,node): super(ResBlock,self).__init__() self.node=node self.linear1=nn.Linear(self.node,self.node) self.linear2=nn.Linear(self.node,self.node) def forward(self,x): y=F.relu(self.linear1(x)) y=self.linear2(y) return F.relu(x+y) ``` 主要文件为 `_02Netbase.py` ,主要功能封装进 `BP` 类和 `ResNet` 类. ## 训练策略 ```python epcho=400 lr=1e-3 #选择优化器 optimizer=torch.optim.Adam(params=bp.parameters(),lr=lr) Loss=nn.MSELoss() #选择损失函数 ``` 训练400轮,学习率为0.001,选择Adam优化器,损失函数选择 MSELoss ## 串口通信 我们小组选择使用 stm32 控制 LED灯和光电传感器数据的读取,将有效数据作为一个整体发出,发送周期50ms; ## 线程管理 主要分为四个线程,线程之间利用 `Queue` 进行通信,通过 `threading` 库实现并行: ### 获得 stm32 读取的数据 以10ms为周期读取串口数据,同时将光强数据转换为 `tensor`类型,将转换好的数据存入消息队列,主要文件 `_04serial.py`,主要功能封装进 `mySerial` 类. ### 处理光强数据并发送 从消息队列中获取光强数据,用训练好的模型处理光强数据,得到相应的坐标数据,将坐标数据发送到消息队列,主要文件 `_05Publisher.py` ,主要功能封装进 `Publisher` 类. ### 将坐标数据可视化 从消息队列中获取坐标数据,填入到播放器接口,主要设置了2D和3D两种类型播模式,两种模式各占用一个线程,实时可视化坐标数据,主要文件 `_03Player.py` ,主要功能封装进 `Player2D` 和 `Player3D` 类.