package main import ( "cicv-data-closedloop/pjisuv_msgs" "fmt" "math" ) func Topic() string { return "/tpperception" } // Label todo 禁止存在下划线_ // MultiPedestrianAhead // MultiCarAhead // MultiTruckAhead // MultiBicycleAhead // MultiTricycleAhead // MultiTrafficConeAhead func Label() string { return "MultiPedestrianAhead" } type Record struct { StableFrame int LastExistingTime float64 } var record *Record = nil // typeCheck 目标物类型检测 // × 金龙车:CAR_TYPE=0, TRUCK_TYPE=1, PEDESTRIAN_TYPE=2, CYCLIST_TYPE=3, UNKNOWN_TYPE=4, UNKNOWN_MOVABLE_TYPE=5, UNKNOWN_UNMOVABLE_TYPE=6 // √ 多功能车:UNKNOWN TYPE=O, PEDESTRIAN TYPE=1, CAR TYPE=2, TRUCK TYPE=3, Bicycle TYPE=4, Tricycle TYPE=5, Traffic Cone TYPE=6 func typeCheck(obj *pjisuv_msgs.PerceptionObject) bool { const targetType uint8 = 1 return targetType == obj.Type } // posCheck 判断目标物位置关系 func posCheck(obj *pjisuv_msgs.PerceptionObject) bool { const laneWidth = 3.5 // m return obj.X > 0 && math.Abs(float64(obj.Y)) < laneWidth*1.5 } // Rule 检测前方指定目标物数量 func Rule(msg *pjisuv_msgs.PerceptionObjects) string { defer func() { if r := recover(); r != nil { fmt.Println("Recovered from panic:", r) } }() const Cgcs2000X = 456256.260152 const Cgcs2000Y = 4397809.886833 const MinStableFrameCount = 5 // frame const MaxTimeBetweenFrame = 0.5 // second const minTargetNum = 4 if len(msg.Objs) >= minTargetNum { currTargetNum := 0 for _, obj := range msg.Objs { // 判断目标物是否满足筛选条件 if typeCheck(&obj) && posCheck(&obj) { currTargetNum++ } } if currTargetNum >= minTargetNum { if nil == record { record = &Record{ StableFrame: 1, LastExistingTime: msg.Header.TimeStamp, } } else { newRecord := Record{ StableFrame: 1, LastExistingTime: msg.Header.TimeStamp, } if newRecord.LastExistingTime-record.LastExistingTime <= MaxTimeBetweenFrame { newRecord.StableFrame = record.StableFrame + 1 if newRecord.StableFrame == MinStableFrameCount { record = nil return Label() } else { } } else { } record = &newRecord } } } return "" }