宠物健康监测传感器技术:多传感器融合与数据处理 摘要本文深入讲解宠物健康监测中的传感器技术涵盖PPG心率血氧、IMU活动监测、体温传感、体重监测等以及多传感器融合算法。一、宠物健康监测指标体系1.1 核心生理指标指标正常范围犬正常范围猫监测方式临床意义心率60-140 bpm140-220 bpmPPG/ECG心脏健康呼吸率15-30 rpm20-30 rpmIMU/胸阻抗呼吸系统体温37.5-39.2℃38.0-39.5℃热敏电阻感染/炎症血氧95%95%PPG双波长呼吸功能活动量品种相关品种相关IMU整体健康睡眠质量12-14h/天12-16h/天IMU神经系统饮水量50-70ml/kg/天40-60ml/kg/天流量传感器肾脏功能体重品种相关品种相关称重传感器代谢健康1.2 健康评分模型classHealthScoreModel:def__init__(self,pet_type,breed,age):self.pet_typepet_type self.breedbreed self.ageage self.weights{heart_rate:0.20,respiratory:0.15,temperature:0.15,spo2:0.15,activity:0.15,sleep:0.10,weight:0.10}defcalculate_score(self,metrics):计算健康评分 (0-100)scores{}# 心率评分hr_normalself.get_normal_range(heart_rate)scores[heart_rate]self.score_metric(metrics[heart_rate],hr_normal)# 体温评分temp_normalself.get_normal_range(temperature)scores[temperature]self.score_metric(metrics[temperature],temp_normal)# 活动量评分activity_baselineself.get_activity_baseline()scores[activity]self.score_activity(metrics[daily_steps],activity_baseline)# 加权总分total_scoresum(scores[k]*self.weights[k]forkinself.weights)return{total:round(total_score,1),details:scores,status:self.get_status(total_score)}defscore_metric(self,value,normal_range):单指标评分low,highnormal_rangeiflowvaluehigh:return100elifvaluelow:deviation(low-value)/lowelse:deviation(value-high)/highreturnmax(0,100-deviation*200)二、PPG心率血氧监测2.1 PPG原理光电容积脉搏波描记法(PPG)通过检测血液对光的吸收变化来测量心率和血氧。LED (绿光/红光/红外) │ ▼ ┌─────────────────────┐ │ 皮肤组织 │ │ ┌───────────────┐ │ │ │ 血管 │ │ │ │ ┌─────────┐ │ │ │ │ │ 血液流动 │ │ │ │ │ └─────────┘ │ │ │ └───────────────┘ │ └─────────────────────┘ │ ▼ 光电二极管 (PD) │ ▼ 信号处理电路2.2 信号采集电路// MAX86178配置voidppg_sensor_init(void){// LED配置max86178_set_led_current(PPG_LED_GREEN,20);// 20mA绿光max86178_set_led_current(PPG_LED_RED,15);// 15mA红光max86178_set_led_current(PPG_LED_IR,15);// 15mA红外// 采样配置max86178_set_sample_rate(100);// 100Hzmax86178_set_pulse_width(400);// 400μsmax86178_set_adc_range(65536);// 18位ADC// 使能中断max86178_enable_interrupt(PPG_INT_FIFO_FULL);}// 数据读取voidppg_read_data(ppg_data_t*data){uint32_traw_data[6];// 6通道// 从FIFO读取max86178_read_fifo(raw_data,6);// 分离通道data-greenraw_data[0];data-redraw_data[1];data-irraw_data[2];data-ambientraw_data[3];data-green2raw_data[4];data-red2raw_data[5];}2.3 心率算法// 基于峰值检测的心率计算#defineSAMPLE_RATE100#defineWINDOW_SIZE256// 2.56秒窗口#defineMIN_PEAK_DIST30// 最小峰值间距(采样点)typedefstruct{floatbuffer[WINDOW_SIZE];inthead;floatthreshold;intlast_peak_idx;intpeak_count;floatheart_rate;}hr_detector_t;voidhr_detect_init(hr_detector_t*det){memset(det,0,sizeof(hr_detector_t));det-threshold0.5;det-last_peak_idx-MIN_PEAK_DIST;}floathr_detect_process(hr_detector_t*det,floatsample){// 带通滤波 (0.5-5Hz对应30-300bpm)floatfilteredbandpass_filter(sample,0.5,5.0,SAMPLE_RATE);// 添加到缓冲区det-buffer[det-head]filtered;det-head(det-head1)%WINDOW_SIZE;// 自适应阈值floatmeancalculate_mean(det-buffer,WINDOW_SIZE);floatstdcalculate_std(det-buffer,WINDOW_SIZE);det-thresholdmean0.5*std;// 峰值检测if(filtereddet-threshold){intdistdet-head-det-last_peak_idx;if(dist0)distWINDOW_SIZE;if(distMIN_PEAK_DIST){// 检测到峰值det-peak_count;// 计算心率if(det-peak_count2){floatinterval(float)dist/SAMPLE_RATE;// 秒det-heart_rate60.0/interval;// bpm// 平滑滤波det-heart_rateema_filter(det-heart_rate,0.3);}det-last_peak_idxdet-head;}}returndet-heart_rate;}2.4 血氧算法// 基于红光/红外比值的血氧计算floatspo2_calculate(uint32_tred_ac,uint32_tred_dc,uint32_tir_ac,uint32_tir_dc){// 计算AC/DC比值floatratio((float)red_ac/red_dc)/((float)ir_ac/ir_dc);// 经验公式需校准// SpO2 A - B * ratio// A, B为校准系数floatA110.0;floatB25.0;floatspo2A-B*ratio;// 限幅if(spo2100)spo2100;if(spo270)spo270;returnspo2;}// 多波长融合提高精度typedefstruct{floatred;floatir;floatgreen;}multi_wavelength_t;floatspo2_fusion(multi_wavelength_t*data){// 传统红/红外算法floatspo2_red_irspo2_calculate(data-red_ac,data-red_dc,data-ir_ac,data-ir_dc);// 绿光辅助算法floatspo2_greenspo2_green_method(data-green);// 加权融合floatfusion0.7*spo2_red_ir0.3*spo2_green;returnfusion;}2.5 运动伪影去除// 自适应噪声消除typedefstruct{floatmu;// 步长因子floatw[NUM_TAPS];// 滤波器权重floatx[NUM_TAPS];// 参考信号缓冲区}anc_filter_t;floatanc_process(anc_filter_t*anc,floatppg_signal,floataccel_signal){// 更新参考信号缓冲区for(intiNUM_TAPS-1;i0;i--){anc-x[i]anc-x[i-1];}anc-x[0]accel_signal;// 计算滤波器输出floaty0;for(inti0;iNUM_TAPS;i){yanc-w[i]*anc-x[i];}// 误差信号floaterrorppg_signal-y;// LMS更新权重for(inti0;iNUM_TAPS;i){anc-w[i]2*anc-mu*error*anc-x[i];}returnerror;// 去噪后的PPG信号}三、IMU活动监测3.1 运动特征提取// 从加速度数据提取特征typedefstruct{floatmean_x,mean_y,mean_z;floatstd_x,std_y,std_z;floatmagnitude_mean;floatmagnitude_std;floatzero_crossing_rate;floatenergy;floatentropy;}imu_features_t;voidextract_imu_features(float*accel_x,float*accel_y,float*accel_z,intlength,imu_features_t*features){// 均值features-mean_xmean(accel_x,length);features-mean_ymean(accel_y,length);features-mean_zmean(accel_z,length);// 标准差features-std_xstd(accel_x,length);features-std_ystd(accel_y,length);features-std_zstd(accel_z,length);// 合成加速度floatmagnitude[length];for(inti0;ilength;i){magnitude[i]sqrt(accel_x[i]*accel_x[i]accel_y[i]*accel_y[i]accel_z[i]*accel_z[i]);}features-magnitude_meanmean(magnitude,length);features-magnitude_stdstd(magnitude,length);// 过零率features-zero_crossing_ratezero_crossing_rate(accel_x,length);// 能量features-energy0;for(inti0;ilength;i){features-energymagnitude[i]*magnitude[i];}features-energy/length;// 熵features-entropysignal_entropy(magnitude,length);}3.2 活动分类// 活动类型定义typedefenum{ACTIVITY_REST0,// 静止ACTIVITY_WALK,// 行走ACTIVITY_RUN,// 奔跑ACTIVITY_PLAY,// 玩耍ACTIVITY_EAT,// 进食ACTIVITY_SLEEP,// 睡眠ACTIVITY_CLIMB,// 攀爬ACTIVITY_ANOMALY// 异常}activity_type_t;// 基于决策树的活动分类activity_type_tclassify_activity(imu_features_t*features){// 决策树逻辑if(features-magnitude_std0.1){// 低活动if(features-magnitude_mean9.85){returnACTIVITY_SLEEP;}else{returnACTIVITY_REST;}}elseif(features-magnitude_std0.5){// 中等活动if(features-zero_crossing_rate0.3){returnACTIVITY_EAT;}else{returnACTIVITY_WALK;}}elseif(features-magnitude_std1.5){// 高活动returnACTIVITY_PLAY;}else{// 极高活动if(features-energy50){returnACTIVITY_RUN;}else{returnACTIVITY_ANOMALY;}}}3.3 步数计算// 基于峰值检测的步数计算typedefstruct{floatbuffer[128];intidx;intstep_count;floatlast_peak_val;intlast_peak_time;floatthreshold;}pedometer_t;intpedometer_process(pedometer_t*ped,floataccel_mag,inttimestamp){// 更新缓冲区ped-buffer[ped-idx]accel_mag;ped-idx(ped-idx1)%128;// 计算动态阈值floatmean_valmean(ped-buffer,128);floatstd_valstd(ped-buffer,128);ped-thresholdmean_val0.4*std_