当前位置:首页>python>割草机器人多维度安全防护检测算法Python

割草机器人多维度安全防护检测算法Python

  • 2026-10-11 05:47:42
割草机器人多维度安全防护检测算法Python

割草机器人多维度安全防护检测算法Python

◦ 包含:碰撞检测、离地检测、翻倒检测、人体触碰急停、高温检测

◦ 逻辑:触发任意安全条件,立即停刀+停机
功能说明

实现碰撞、离地、翻倒、人体触碰、高温5重安全检测,任一异常触发:刀盘停机+整机动力停机,适配算法逻辑分层设计,模块化易移植单片机/嵌入式。
import time

# ====================== 安全阈值配置(硬件标定参数) ======================
SAFE_TEMP_MAX = 75.0        # 电机/主控高温阈值℃
ACC_GROUND_DOWN = 0.3       # 离地判定:Z轴加速度小于该值判定离地
ROLL_MAX_ANGLE = 45.0       # 翻滚倾角阈值(度),大于则翻倒
COLLIDE_FORCE_MIN = 80      # 碰撞压力传感器阈值
TOUCH_SIGNAL_LEVEL = 1      # 人体触碰传感器电平标识

# 机器人状态全局标识
is_knife_running = True     # 刀盘运转标记
is_robot_running = True     # 整车行走标记

# ====================== 传感器数据模拟采集函数(对接真实ADC/IMU) ======================
def get_sensor_data():
   """模拟实时读取:碰撞压力、离地Z加速度、翻滚倾角、触碰信号、温度"""
   import random
   data = {
       "collision_force": random.randint(20, 120),    # 碰撞传感器压力
       "z_acc": round(random.uniform(0.1, 0.9),2),     # IMU-Z轴加速度(g)
       "roll_angle": round(random.uniform(0,60),1),   # 横滚倾角
       "touch_signal": random.randint(0,1),           # 0无触碰 1人体触碰
       "chip_temp": round(random.uniform(40,85),1)    # 主控+刀盘电机温度
   }
   return data

# ====================== 安全停机执行函数 ======================
def emergency_stop():
   global is_knife_running, is_robot_running
   if is_knife_running:
       is_knife_running = False
       print("【执行急停】刀盘电机断电停转")
   if is_robot_running:
       is_robot_running = False
       print("【执行急停】行走驱动整机停机")

# ====================== 分项安全检测算法 ======================
def check_all_safety(sensor):
   err_list = []
   # 1.碰撞检测:压力超阈值
   if sensor["collision_force"] >= COLLIDE_FORCE_MIN:
       err_list.append("碰撞触发")
   # 2.离地检测:Z轴加速度过小,轮子悬空
   if sensor["z_acc"] <= ACC_GROUND_DOWN:
       err_list.append("机身离地")
   # 3.翻倒检测:横滚角超安全倾角
   if sensor["roll_angle"] >= ROLL_MAX_ANGLE:
       err_list.append("机身翻倒")
   # 4.人体触碰检测:触碰传感器高电平
   if sensor["touch_signal"] == TOUCH_SIGNAL_LEVEL:
       err_list.append("人体触碰")
   # 5.高温检测:温度超标
   if sensor["chip_temp"] >= SAFE_TEMP_MAX:
       err_list.append("硬件高温")

   # 任意故障触发立即急停
   if len(err_list) > 0:
       print(f"\n====安全异常:{err_list}====")
       emergency_stop()
       return False
   print("全部安全,正常运行")
   return True

# ====================== 主循环(机器人实时巡检,100ms周期) ======================
if __name__ == "__main__":
   print("割草机器人多重安全防护系统启动")
   try:
       while True:
           sen_data = get_sensor_data()
           print(f"\n实时传感:{sen_data}")
           check_all_safety(sen_data)
           time.sleep(0.1) # 100ms巡检周期,适配嵌入式采样速率
   except KeyboardInterrupt:
       print("\n系统正常退出")
算法架构&移植说明

1.五大检测逻辑

1. 碰撞检测:防撞环压力传感器采样,压力>阈值判定撞障碍物

2. 离地检测:IMU三轴加速度Z轴采集,离地后重力分量骤降

3. 翻倒检测:陀螺仪解算横滚角,倾角>45°判定侧翻

4. 人体触碰:机身周圈电容式触碰传感器,高电平即人体接触

5. 高温检测:NTC热敏电阻采集电机/主控温度,超温停机

2.嵌入式C语言改造要点(适配STM32/ESP32主控)

1. 替换get_sensor_data()为ADC读取、I2C读取MPU6050陀螺仪硬件接口

2. 主循环替换为while(1),采用定时器100ms定时中断巡检安全

3. emergency_stop()直接操作GPIO引脚关断刀盘MOS管、行走驱动芯片

3.算法优化思路(软件滤波防误触)

• 连续3次采样异常才触发停机,消除传感器抖动误判

• 温度采用一阶RC滤波算法平滑采样值

• 倾角采用互补滤波优化IMU数据,颠簸路面防误翻倒

补充C语言嵌入式版本代码

一、STM32嵌入式C版本|割草机器人5重安全防护算法(可直接烧录,适配MPU6050+NTC+电容触碰+防撞开关)

设计要点

1. 5项安全:碰撞/离地/翻倒/人体触碰/高温,任一满足立刻关刀盘+行走电机

2. 软件防抖:连续N帧异常才急停,抑制传感器杂波误触发

3. 100ms定时周期安全巡检,标准嵌入式架构
#include "stm32f10x.h"
#include

/*********************参数配置区【硬件标定修改此处】********************/
#define SAFE_TEMP_MAX       75.0f    //最高安全温度℃
#define Z_ACC_THRESHOLD     0.3f     //离地Z轴加速度阈值(g)
#define ROLL_ANGLE_MAX     45.0f     //翻倒倾角阈值°
#define COLLIDE_THRESHOLD   80U      //碰撞压力阈值
#define TOUCH_VALID        1U        //触碰有效电平
#define FILTER_CNT          3U       //连续3次异常才停机,防抖
/**********************************************************************/

//传感器结构体
typedef struct{
   uint16_t collide_force;    //碰撞压力
   float    z_acc;            //IMU Z轴加速度 g
   float    roll_angle;       //横滚倾角 °
   uint8_t  touch_level;      //人体触碰 0/1
   float    temp;             //温度℃
}Sensor_t;

//故障计数缓存
typedef struct{
   uint8_t collide_err;
   uint8_t ground_err;
   uint8_t roll_err;
   uint8_t touch_err;
   uint8_t temp_err;
}ErrFilter_t;

ErrFilter_t err_filter = {0};
Sensor_t sensor_data;

/*硬件驱动声明 对接底层IO/ADC/I2C*/
void Read_Sensor(Sensor_t *p_sen);    //读取所有传感器
void Stop_Knife_Motor(void);          //停止刀盘
void Stop_Walk_Motor(void);           //停止行走
void TIM1_Init_100ms(void);           //100ms定时中断

//全局停机标志
uint8_t sys_emerg_stop = 0;

/****************安全检测+滤波算法****************/
uint8_t Safety_Check(Sensor_t *p_sen)
{
   uint8_t is_abnormal = 0;
   //1碰撞检测
   if(p_sen->collide_force >= COLLIDE_THRESHOLD){
       err_filter.collide_err++;
       if(err_filter.collide_err >= FILTER_CNT) is_abnormal = 1;
   }else{
       err_filter.collide_err = 0;
   }
   //2离地检测 Z轴过小悬空
   if(p_sen->z_acc <= Z_ACC_THRESHOLD){
       err_filter.ground_err++;
       if(err_filter.ground_err >= FILTER_CNT) is_abnormal = 1;
   }else{
       err_filter.ground_err = 0;
   }
   //3翻倒检测
   if(p_sen->roll_angle >= ROLL_ANGLE_MAX){
       err_filter.roll_err++;
       if(err_filter.roll_err >= FILTER_CNT) is_abnormal = 1;
   }else{
       err_filter.roll_err = 0;
   }
   //4人体触碰
   if(p_sen->touch_level == TOUCH_VALID){
       err_filter.touch_err++;
       if(err_filter.touch_err >= FILTER_CNT) is_abnormal = 1;
   }else{
       err_filter.touch_err = 0;
   }
   //5高温
   if(p_sen->temp >= SAFE_TEMP_MAX){
       err_filter.temp_err++;
       if(err_filter.temp_err >= FILTER_CNT) is_abnormal = 1;
   }else{
       err_filter.temp_err = 0;
   }

   //任意异常触发全停机
   if(is_abnormal == 1)
   {
       sys_emerg_stop = 1;
       Stop_Knife_Motor();
       Stop_Walk_Motor();
   }
   return is_abnormal;
}

/****************100ms定时中断回调函数 安全轮询入口****************/
void TIM1_IRQHandler(void)
{
   if(TIM_GetITStatus(TIM1,TIM_IT_Update) != RESET)
   {
       if(sys_emerg_stop == 0) //未急停才采集检测
       {
           Read_Sensor(&sensor_data);
           Safety_Check(&sensor_data);
       }
       TIM_ClearITPendingBit(TIM1,TIM_IT_Update);
   }
}

int main(void)
{
   //外设初始化
   TIM1_Init_100ms();
   while(1)
   {
       if(sys_emerg_stop == 0)
       {
           //正常运行逻辑
       }
       else
       {
           //停机保持状态
       }
   }
}

/****************底层硬件空函数,用户根据实际硬件填充IO/ADC/I2C****************/
void Read_Sensor(Sensor_t *p_sen)
{
   //p_sen->collide_force = ADC_Read(通道);
   //p_sen->z_acc = MPU6050_GetZAcc();
   //p_sen->roll_angle = MPU6050_GetRoll();
   //p_sen->touch_level = GPIO_ReadInputPin(TOUCH_PIN);
   //p_sen->temp = NTC_GetTemp(ADC_CH);
}
void Stop_Knife_Motor(void)
{
   //GPIO置低关闭刀盘MOS
}
void Stop_Walk_Motor(void)
{
   //驱动芯片失能,整机停走
}
void TIM1_Init_100ms(void)
{
   //定时器配置,100ms溢出中断
}
二、补充:RC一阶滤波算法(温度/加速度平滑,优化防抖)

加在Read_Sensor内部,抑制传感器跳变:
#define FILTER_ALPHA 0.2f  //滤波系数0~1,越小越平滑
float temp_filter = 0;
float zacc_filter = 0;

//一阶RC滤波函数
float RC_Filter(float new_data,float *old_data,float alpha)
{
   *old_data = alpha*new_data + (1-alpha)*(*old_data);
   return *old_data;
}

//调用示例:
p_sen->temp = RC_Filter(raw_temp,&temp_filter,FILTER_ALPHA);
p_sen->z_acc = RC_Filter(raw_z,&zacc_filter,FILTER_ALPHA);
三、算法使用说明

1. 硬件对应

• 碰撞:机身防撞环+分压压力传感器/微动开关 → ADC采集

• 离地+翻倒:MPU6050/MPU9250 IMU,I2C读取加速度+倾角

• 人体触碰:机身围边电容触摸芯片输出IO电平

• 高温:电机NTC热敏电阻ADC测温

2. 安全逻辑:5路独立计数滤波,单路连续3次异常直接锁死停机,需要人工复位才重启

3. 移植ESP32:只需替换GPIO、ADC、I2C驱动函数,检测逻辑完全不用改动

最新文章

随机文章