package main import ( "cicv-data-closedloop/pjisuv_msgs" "fmt" "math" "sync" ) var ( threshold float64 = 15 / 3.6 count1 int = 0 ) func Topic() string { return "/cicv_location" } // 禁止存在下划线_ func Label() string { return "ReverseAndOverspeed" } func calculateDirectionAngle(speedX, speedY float64) float64 { // 使用反正切函数计算方向角 angle := math.Atan2(speedY, speedX) // 将角度转换为度数 angleDegree := angle * (180 / math.Pi) // 将角度限定在 0~360 范围内 if angleDegree < 0 { angleDegree += 360 } else if angleDegree > 360 { angleDegree -= 360 } return angleDegree } // 主进程的逻辑是先判断触发再缓存全局变量 func Rule(shareVars *sync.Map, data *pjisuv_msgs.PerceptionLocalization) string { defer func() { if r := recover(); r != nil { fmt.Println("Recovered from panic:", r) } }() if count1%200 == 0 { OutsideWorkshopFlag, ok3 := shareVars.Load("OutsideWorkshopFlag") if ok3 { directionAngle := calculateDirectionAngle(data.VelocityX, data.VelocityY) AbsSpeed, _ := shareVars.Load("AbsSpeed") diffAngle := math.Abs(float64(directionAngle - data.Yaw)) //fmt.Println(diffAngle) if AbsSpeed.(float64) >= threshold && diffAngle >= 160 && diffAngle <= 200 && OutsideWorkshopFlag.(bool) { eventLabel := "ReverseAndOverspeed" fmt.Println(eventLabel) count1 = 1 return Label() } } } count1++ return "" }