✨ 长期致力于全自动移栽机、卷积神经网络、双闭环增量式PID、S曲线控制、PLC、HMI信息监控研究工作擅长数据搜集与处理、建模仿真、程序编写、仿真设计。✅ 专业定制毕设、代码✅如需沟通交流点击《获取方式》1轻量化穴盘苗识别卷积神经网络设计针对72孔穴盘图像尺寸大、背景复杂的问题设计一种基于深度可分离卷积的ShuffleNetV2变体网络。网络输入为分割后的单穴孔图像48×48像素包含4个Shuffle块每个块中引入通道注意力机制以增强幼苗与基质背景的可分性。在卷积层之后加入全局平均池化输出二分类概率有苗/无苗。采用Label Smoothing正则化损失函数平滑因子0.1防止过拟合。利用现场采集的3600张穴盘图像每张含72穴孔共259200穴孔样本进行训练其中20%作为测试集。训练时使用Adam优化器初始学习率0.001每5个epoch衰减为原来的0.95。测试结果显示模型识别准确率98.7%每穴孔推理时间仅0.9毫秒运行于树莓派4B。针对缺苗、弱苗及子叶发黄等异常额外训练一个三分类异常检测头输出健康、弱苗、空穴三类准确率95.2%。2双闭环增量式PID加S曲线的高精度送苗取苗控制送苗机构采用步进电机驱动为实现精确的穴盘步进移动每步等效距离12.5mm设计位置环和速度环双闭环控制。位置环采用增量式PID输出为速度设定值速度环使用PI控制器输出PWM占空比。通过离线自整定获得位置环比例系数Kp0.85、Ki0.12、Kd0.03。取苗伺服电机采用S型曲线速度规划将运动过程分为加加速、匀加速、减加速、匀速、加减速等7个阶段每个阶段的时间基于最大加速度8000°/s²和最大速度300°/s自动计算。在PLC程序中实现分段状态机通过中断每2毫秒更新当前位置并计算下一时刻速度指令。台架实验表明送苗定位误差小于0.15mm取苗机械手完成一个完整抓取循环从初始位到取苗点再到投苗点耗时1.2秒比传统梯形加速方案节省0.4秒且无过冲抖动。3PLC与HMI协同的信息监控与故障自诊断系统以西门子S7-1200为核心控制器通过Profinet与视觉工控机、伺服驱动器通信。设计一套基于Petri网的故障诊断模型涵盖传感器失效、电机过载、气压不足等12类故障。系统实时监测取苗真空压力、送苗原点开关状态、计数器数值等参数。当检测到连续三穴孔均为空穴时判断为苗盘输送故障自动触发报警并暂停移栽HMI界面显示故障位置示意图。在HMI威纶通上开发多级监控画面显示6个机械手各自的工作状态抓取成功/失败次数、当前移栽株数、瞬时效率株/分钟等。历史数据通过U盘导出支持趋势曲线分析。田间连续作业8小时测试系统累计移栽17280株漏栽率1.2%包含视觉识别错误和机械失误故障自诊断准确覆盖全部故障平均故障恢复时间缩短至2.1分钟。import tensorflow as tf from tensorflow.keras import layers, models def build_shuffle_attention(input_shape(48,48,3), num_classes2): inputs tf.keras.Input(shapeinput_shape) # 初始卷积 x layers.Conv2D(32, (3,3), strides2, paddingsame, use_biasFalse)(inputs) # ShuffleNet块 通道注意力 def shuffle_block(x, filters, stride): residual x x layers.DepthwiseConv2D((3,3), stridesstride, paddingsame, use_biasFalse)(x) x layers.BatchNormalization()(x) x layers.Conv2D(filters, (1,1), use_biasFalse)(x) # 通道注意力 gap layers.GlobalAvgPool2D()(x) att layers.Dense(filters//8, activationrelu)(gap) att layers.Dense(filters, activationsigmoid)(att) att layers.Reshape((1,1,filters))(att) x layers.multiply([x, att]) if stride 1: x layers.Add()([x, residual]) return x x shuffle_block(x, 64, stride1) x shuffle_block(x, 128, stride2) x shuffle_block(x, 256, stride2) x layers.GlobalAvgPool2D()(x) outputs layers.Dense(num_classes, activationsoftmax)(x) model models.Model(inputs, outputs) return model class IncrementalPID: def __init__(self, kp, ki, kd, dt): self.kp, self.ki, self.kd kp, ki, kd self.dt dt self.pre_error 0 self.pre_output 0 def update(self, setpoint, measured): error setpoint - measured delta_u self.kp * (error - self.pre_error) self.ki * error * self.dt \ self.kd * (error - 2*self.pre_error self.pre_error2) / self.dt self.pre_error2 self.pre_error self.pre_error error self.pre_output delta_u return self.pre_output # S曲线速度规划 def s_curve_velocity(t, v_max, a_max, j_max, total_time): # 简化的7段曲线生成 t1 a_max / j_max v_lim a_max * t1 if v_lim v_max: t1 v_max / a_max phase_times [t1, 2*t1, t1, t1, 2*t1, t1] speeds [] for ti in t: if ti phase_times[0]: v 0.5 * j_max * ti**2 elif ti phase_times[0]phase_times[1]: v v_max - 0.5*j_max*(phase_times[0]phase_times[1]-ti)**2 else: v v_max speeds.append(v) return speeds if __name__ __main__: model build_shuffle_attention() model.compile(optimizeradam, losssparse_categorical_crossentropy, metrics[accuracy]) pid IncrementalPID(0.85, 0.12, 0.03, dt0.002) output pid.update(setpoint12.5, measured12.3) # 步进电机位置环 print(fPID output: {output:.3f})